5月 26

DEFCON 18 CTF Binary l33tness 200(b200) writeup

このwriteupは、一緒に頑張ってくれたykwsmから提供してもらいました。

問題: what treasure did pirates get?

問題ファイル

問題ファイルが何かを確認。
$ file b200_d00d7ddebd7034560.bin
b200_d00d7ddebd7034560.bin: ELF 32-bit LSB shared object, Intel 80386,
version 1 (SYSV), dynamically linked, stripped
実行してみる。
pentest@pubuntu:~/ctf/binary200$ ./b200_d00d7ddebd7034560.bin
Segmentation fault

おちる。

hexdumpの結果を見ると、Haiku-OSでコンパイルされたバイナリとわかる。
00001530 01 00 00 00 00 01 00 00 02 00 02 00 00 47 43 43 |.............GCC|
00001540 3a 20 28 47 4e 55 29 20 32 2e 39 35 2e 33 2d 68 |: (GNU) 2.95.3-h|
00001550 61 69 6b 75 2d 30 39 30 36 32 39 00 00 47 43 43 |aiku-090629..GCC|
00001560 3a 20 28 47 4e 55 29 20 32 2e 39 35 2e 33 2d 68 |: (GNU) 2.95.3-h|
00001570 61 69 6b 75 2d 30 39 30 36 32 39 00 00 47 43 43 |aiku-090629..GCC|
00001580 3a 20 28 47 4e 55 29 20 32 2e 39 35 2e 33 2d 68 |: (GNU) 2.95.3-h|
00001590 61 69 6b 75 2d 30 39 30 36 32 39 00 00 47 43 43 |aiku-090629..GCC|
000015a0 3a 20 28 47 4e 55 29 20 32 2e 39 35 2e 33 2d 68 |: (GNU) 2.95.3-h|
000015b0 61 69 6b 75 2d 30 39 30 36 32 39 00 00 47 43 43 |aiku-090629..GCC|
000015c0 3a 20 28 47 4e 55 29 20 32 2e 39 35 2e 33 2d 68 |: (GNU) 2.95.3-h|
000015d0 61 69 6b 75 2d 30 39 30 36 32 39 00 00 2e 73 68 |aiku-090629...sh|
000015e0 73 74 72 74 61 62 00 2e 68 61 73 68 00 2e 64 79 |strtab..hash..dy|
000015f0 6e 73 79 6d 00 2e 64 79 6e 73 74 72 00 2e 72 65 |nsym..dynstr..re|
00001600 6c 2e 64 79 6e 00 2e 72 65 6c 2e 70 6c 74 00 2e |l.dyn..rel.plt..|
00001610 69 6e 69 74 00 2e 74 65 78 74 00 2e 66 69 6e 69 |init..text..fini|
00001620 00 2e 72 6f 64 61 74 61 00 2e 65 68 5f 66 72 61 |..rodata..eh_fra|
00001630 6d 65 00 2e 63 74 6f 72 73 00 2e 64 74 6f 72 73 |me..ctors..dtors|
00001640 00 2e 64 79 6e 61 6d 69 63 00 2e 67 6f 74 00 2e |..dynamic..got..|
00001650 64 61 74 61 00 2e 62 73 73 00 2e 63 6f 6d 6d 65 |data..bss..comme|
00001660 6e 74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |nt..............|
ここでHaiku-OSのVMイメージをダウンロードし、その上で実行。

以下、Haiku-OS上で実施。Haiku-OS上で実行すると、同様に落ちる。関数pre_init内、アドレス0x002011f5で”General
protection fault”例外が発生し、落ちている
gdb ./b200_d00d7ddebd7034560.bin
(gdb) r
Starting program: /boot/home/./b200_d00d7ddebd7034560.bin
Thread 235 caused an exception: General protection fault
Program received signal SIGILL, Illegal instruction.
0x002011f5 in pre_init ()
objdumpで当該箇所のコードを見てみる。

0x000011f5(0x002011f5)にあるINT
80により例外が発生して落ちているとわかる。
何らかの機構なのかよく知らないものの、関数本体らしきものは後半0x00001200(0x00201200)から始まっている。
000011f0 <pre_init>:
11f0: b8 1d 00 00 00 mov $0x1d,%eax
11f5: cd 80 int $0x80
11f7: c9 leave
11f8: c3 ret
11f9: 90 nop
11fa: 90 nop
11fb: 90 nop
11fc: 90 nop
11fd: 90 nop
11fe: 90 nop
11ff: 90 nop
1200: 55 push %ebp
1201: 89 e5 mov %esp,%ebp
この先頭部分を通って実行される、frame_exit関数内の下記の通り0x00001113c(0x0020113c)のみ。
1131: 50 push %eax
1132: 6a 04 push $0x4
1134: e8 03 f7 ff ff call 83c
1139: 83 c4 f4 add $0xfffffff4,%esp
113c: e8 af 00 00 00 call 11f0 1141: 8b 5d e8 mov 0xffffffe8(%ebp),%ebx
1144: 89 ec mov %ebp,%esp
1146: 5d pop %ebp
1147: c3 ret
当該箇所の直前でbreak。gdb ./b200_d00d7ddebd7034560.bin
(gdb) b *0x0020113c
Breakpoint 1 at 0x20113c
(gdb) r
Starting program: /boot/home/./b200_d00d7ddebd7034560.bin
[tcsetpgrp failed in terminal_inferior: Invalid Argument]
Breakpoint 1, 0x0020113c in frame_exit ()
(gdb)
pre_initをコールしないようjump。そうしたら最後まで実行でき、何やらURLが出てきました。
(gdb) jump *0x00201141
Continuing at 0x201141.
http://is.gd/bUBRD
Program exited normally.
gdb: child_close, inferior_ptid=245
(gdb)
このURLにアクセスすると、以下のようなサイトがあり、答えを発見。ここに答えがありました。
右のラクダのポスターにも書かれているし、URLにも入っている。

答えは、「asses of the caribbean」。



Copyright 2017. All rights reserved.

Posted 2010年5月26日 by ntsuji in category "未分類