PayloadGenerator
片手で気合で埋めてくCTF Advent Calendar 2015の4日目です。
書いてくれたのむ。
Pwn、やってますか
時々Pwnの問題を解いているとき、ポインタの扱いでちょっと困るときがある。
例えば、リターンアドレスから既知のバッファ上に設置されたシェルコードへ飛びたい場合、大体次のようなコードを書く。
payload = 'A' * 40 + p32(buf_addr + 100) payload = payload.ljust(100, '\0') payload += sc
まぁ特に問題ない気がするけど、60文字弱のパディングを入れるのは微妙。もっと調節してもいいけど計算するのは面倒。
どういうことかっていうとこんな感じに書きたい。
payload = PayloadGenerator([ 'A' * 40, Ptr32(sc), ]).generate(base=buf_addr)
できました。
bss = 0x804a000 execve = 0x48484848 a = PayloadGenerator([ p32(execve), 'AAAA', Ptr32('/bin/sh\0'), Ptr32([ Ptr32('/bin/sh\0'), p32(0) ]), Ptr32(p32(0)), ]) print a.generate(base=0).encode('hex') print a.generate(base=bss).encode('hex')
こういうコードを書くと、
4848484841414141140000001c000000300000002f62696e2f736800140000000000000000000000 484848484141414114a004081ca0040830a004082f62696e2f73680014a004080000000000000000
こんな感じに帰ってくる。
雑さ
だいぶ雑に書いてるので多分バグる。
多分便利なんだろうけどこれを使うほどの問題に遭遇してない気がするし必要ないっぽい。