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

バランスを取りたい

よくCTFの記事を書きます

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)

できました。

payload_generator.py · GitHub

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

こんな感じに帰ってくる。

雑さ

だいぶ雑に書いてるので多分バグる

多分便利なんだろうけどこれを使うほどの問題に遭遇してない気がするし必要ないっぽい。

よろしく