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

DEFCON CTF2013 policebox writeup

CTF writeup DEFCON 2013 DEFCON

DEFCON CTFの過去問を解いていきます。

binariesが欲しい方は前回の記事を参照してください。

 

そろそろReversingの方も解いていきたいので、reversing 100を解きました。

実行ファイルとcoreファイルが与えられるわけですが、おそらくcoreファイル内に含まれている、「当時の環境」が重要なのでしょう。

coreファイル内のメモリ情報をメモリに格納して実行などが出来ると嬉しいわけですが、私が知っているrestoreコマンドではcoreファイルは少しrestoreが面倒くさいため、他のコマンドがないか探します。

gdb restore core exec」などで検索すると、recordコマンドというのが引っかかります(https://sourceware.org/ml/gdb/2009-10/msg00414.html)。

どうやら、3年ほど前に追加されたreverse debugに関連するコマンドのようですが、対応してるcoreファイルであれば、記録されている入力情報などを再現出来るらしいです。

さて、記録されている情報といえば、実行時の入力が怪しいので、getcharの後にbreakpointを仕掛けます。

poteti@ubuntu:~/training/policebox$ gdb policebox -c core -q
Reading symbols from /home/poteti/training/policebox/policebox...(no debugging symbols found)...done.
[New LWP 17170]

warning: .dynamic section for "/lib/i386-linux-gnu/libc.so.6" is not at the expected address (wrong library or version mismatch?)

warning: .dynamic section for "/lib/ld-linux.so.2" is not at the expected address (wrong library or version mismatch?)
Core was generated by `policebox'.
#0  0x08048621 in main ()
(gdb) record
Restored records from core file /home/poteti/training/policebox/core.
#0  0x08048621 in main ()
(gdb) b *0x08048695
Breakpoint 1 at 0x8048695
(gdb) c
Continuing.

Breakpoint 1, 0x08048695 in main ()
(gdb) p/c $al
$1 = 119 'w'

おお、確かに入力されていたみたいですね。

後は入力を全て取り出してやりましょう。

(gdb) while 1
 >p/c $al
 >c
 >end
$2 = 119 'w'

Breakpoint 1, 0x08048695 in main ()
$3 = 48 '0'

Breakpoint 1, 0x08048695 in main ()
$4 = 114 'r'

Breakpoint 1, 0x08048695 in main ()
$5 = 108 'l'

Breakpoint 1, 0x08048695 in main ()
$6 = 100 'd'

Breakpoint 1, 0x08048695 in main ()
$7 = 115 's'

Breakpoint 1, 0x08048695 in main ()
$8 = 46 '.'

Breakpoint 1, 0x08048695 in main ()
$9 = 119 'w'

Breakpoint 1, 0x08048695 in main ()
$10 = 48 '0'

Breakpoint 1, 0x08048695 in main ()
$11 = 114 'r'

Breakpoint 1, 0x08048695 in main ()
$12 = 115 's'

Breakpoint 1, 0x08048695 in main ()
$13 = 116 't'

Breakpoint 1, 0x08048695 in main ()
$14 = 46 '.'

Breakpoint 1, 0x08048695 in main ()
$15 = 107 'k'

Breakpoint 1, 0x08048695 in main ()
$16 = 51 '3'

Breakpoint 1, 0x08048695 in main ()
$17 = 121 'y'

Breakpoint 1, 0x08048695 in main ()
$18 = 108 'l'

Breakpoint 1, 0x08048695 in main ()
$19 = 48 '0'

Breakpoint 1, 0x08048695 in main ()
$20 = 103 'g'

Breakpoint 1, 0x08048695 in main ()
$21 = 103 'g'

Breakpoint 1, 0x08048695 in main ()
$22 = 101 'e'

Breakpoint 1, 0x08048695 in main ()
$23 = 114 'r'

Breakpoint 1, 0x08048695 in main ()
$24 = 33 '!'

 

key is: w0rlds.w0rst.k3yl0gger!

所要時間30分。

これはgdb使えないと解けなかっただろうな...