Exploitation2 writeup
なんと実に3ヶ月ぶりの記事。
社会人という闇に飲まれ、どう時間を使えばいいのかわからず迷走中です。
SECCON beginnersも参加したんですが、writeupを書く余裕がありませんでした。
今日はリハビリも兼ねてpwn listのbabyから、CSAW CTF 2013 exploitation2 を解いたのでwriteupを書きます。
適当に動かしたり何か入力しても何も反応がないので少し詳しく調べると、0.0.0.0 31338 で待ち受けているプログラムであることがわかります。
そこで nc 0.0.0.0 31338 してみると、
,▒▒▒r▒▒Welcome to CSAW CTF. Exploitation 2 will be a little harder this year. Insert your exploit here:
のようなメッセージが出てきます。
なにかゴミが頭にくっついている後に、ここにexploitをぶち込め!と言われます。
checksecしてみるとNXbitがoffなため、return to shellcode自明です。
さらに頭のゴミを調べてみると、1バイト目が入力の置かれるスタックのアドレスであり、2バイト目は何かよくわからない値となっています。
BOFからreturn to shellcode、という想定で進めるため、まずはバッファの大きさを調べると、0x800 = 2048となっています。さらに、canaryがoffであるものの、自前canaryのようなものを実装してチェックを行っていることもわかります。
乱数で生成しているため通常であれば推測不可能ですが、先ほど謎だった出力の頭についていたゴミの2バイト目がこの自前canaryとなっています。
従って、
shellcode + padding + canary + padding + return address
と送ってやることで任意のshellcodeが実行可能になります。
これでシェルをとって終了、と行きたいところですがfork-server型の問題なため単純にsystem(/bin/sh) しても出力が得られません。そこで、いわゆるbind shellと呼ばれるようなコードを実行し適当なポートで待ち受けさせます。