2014年9月15日月曜日

No cON Name CTF Quals 2014 Writeup

cannaBINoid BIN 300

Get the key. The flag is: "NcN_" + sha1sum(key)

$ file cannabinoid
cannabinoid: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped


このプログラムを実行すると入力待ちになるのでとりあえず適当に入力

$./cannabinoid
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
$

すると終了する

idaで見る
.text:080483B0                 public start
.text:080483B0 start           proc near
.text:080483B0                 xor     ebp, ebp
.text:080483B2                 pop     esi
.text:080483B3                 mov     ecx, esp
.text:080483B5                 and     esp, 0FFFFFFF0h
.text:080483B8                 push    eax
.text:080483B9                 push    esp
.text:080483BA                 push    edx
.text:080483BB                 push    offset locret_8048680
.text:080483C0                 push    offset sub_8048610
.text:080483C5                 push    ecx
.text:080483C6                 push    esi
.text:080483C7                 push    offset loc_80484AB
.text:080483CC                 call    ___libc_start_main


text:080484AB loc_80484AB:                            ; DATA XREF: start+17 o
.text:080484AB                 lea     ecx, [esp+4]
.text:080484AF                 and     esp, 0FFFFFFF0h
.text:080484B2                 push    dword ptr [ecx-4]
.text:080484B5                 push    ebp
.text:080484B6                 mov     ebp, esp
.text:080484B8                 push    ebx
.text:080484B9                 push    ecx
.text:080484BA                 sub     esp, 0A0h
.text:080484C0                 mov     ebx, ecx
.text:080484C2                 mov     byte ptr [ebp-0A4h], 59h
.text:080484C9                 mov     byte ptr [ebp-0A3h], 6Fh
.text:080484D0                 mov     byte ptr [ebp-0A2h], 75h
.text:080484D7                 mov     byte ptr [ebp-0A1h], 20h
.text:080484DE                 mov     byte ptr [ebp-0A0h], 67h
.text:080484E5                 mov     byte ptr [ebp-9Fh], 6Fh
.text:080484EC                 mov     byte ptr [ebp-9Eh], 74h
.text:080484F3                 mov     byte ptr [ebp-9Dh], 20h
.text:080484FA                 mov     byte ptr [ebp-9Ch], 69h
.text:08048501                 mov     byte ptr [ebp-9Bh], 74h
.text:08048508                 mov     byte ptr [ebp-9Ah], 21h
.text:0804850F                 mov     byte ptr [ebp-99h], 0
.text:08048516                 cmp     dword ptr [ebx], 1     ←引数があるかみてる
.text:08048519                 jz      short loc_8048525
.text:0804851B                 mov     eax, 1
.text:08048520                 jmp     loc_80485FE         ←あったら終了



最初に You got it! という文字列を生成している
その後freadとかやり

.text:080485B3                 mov     edx, [ebp-10h]
.text:080485B6                 mov     eax, [ebp-18h]
.text:080485B9                 add     eax, edx
.text:080485BB                 movzx   edx, byte ptr [eax]
.text:080485BE                 lea     ecx, [ebp-98h]
.text:080485C4                 mov     eax, [ebp-10h]
.text:080485C7                 add     eax, ecx
.text:080485C9                 movzx   eax, byte ptr [eax]
.text:080485CC                 cmp     dl, al
.text:080485CE                 setz    al
.text:080485D1                 movzx   eax, al
.text:080485D4                 and     [ebp-0Ch], eax
.text:080485D7                 add     dword ptr [ebp-10h], 1
.text:080485DB
.text:080485DB loc_80485DB:                            ; CODE XREF: .text:080485B1 j
.text:080485DB                 cmp     dword ptr [ebp-10h], 7Fh
.text:080485DF                 jle     short loc_80485B3


cmp dl,al を比較しつつ 0x80回ループをまわしている
gdbで見るとalには自分が入力した文字が入っていたのでdlを見ていくことに



#!/usr/bin/gdb
#gdb -x script.py

import gdb

f=open('log','wb')
gdb.execute('file cannabinoid')

gdb.execute('b*0x80485cc')
gdb.execute('display/x $dl')
gdb.execute('r')
d = gdb.execute('p $dl',to_string=True).split('$1 = ')[1]
f.write(chr(int(d,16)))
for i in xrange(1,0x80):
        d=gdb.execute('c',to_string=True).split("1: /x $dl = ")[1]
        f.write(chr(int(d,16)))
gdb.execute('q')


とりあえずファイルに吐き出してみる。

$cat log | hexdump -C

00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 03 00 01 00 00 00  b0 83 04 08 34 00 00 00  |............4...|
00000020  e8 09 00 00 00 00 00 00  34 00 20 00 08 00 28 00  |........4. ...(.|
00000030  1c 00 1b 00 06 00 00 00  34 00 00 00 34 80 04 08  |........4...4...|
00000040  34 80 04 08 00 01 00 00  00 01 00 00 05 00 00 00  |4...............|
00000050  04 00 00 00 03 00 00 00  34 01 00 00 34 81 04 08  |........4...4...|
00000060  34 81 04 08 13 00 00 00  13 00 00 00 04 00 00 00  |4...............|
00000070  01 00 00 00 01 00 00 00  00 00 00 00 00 80 04 08  |................|
00000080

$cat log | ./cannabinoid
You got it!

The flag is: "NcN_" + sha1sum(key)
後はこの形式に合わせて
$sha1sum log
effaf80a641b28a8d8a750b99ef740593bb3dcbd

flag is 
NcN_effaf80a641b28a8d8a750b99ef740593bb3dcbd



最初 0x7f 0x45 0x46 が出てきたときに elfの中にelfがあるのかと絶望していたがこれがkeyでよかった。