NeverLAN CTF 2019 参加記録

01/31~02/03にかけて行われたNeverLAN CTF 2019に参加しました!久しぶりにフルで参加できるぞ~,と張り切っていましたが用事が発生してしまいあまりできませんでした…( ノД`)シクシク…
f:id:verliezer93764:20190204232014p:plain
Binary問がちょっと普段と違う雰囲気の問題で面白かったです.

Binary 1

データが暗号化されてしまったようなので元に戻してくださいという問題.users_dbというテキストファイルが渡されます.
f:id:verliezer93764:20190204232424p:plain
16進の数字が並んでいますが,奇数番目が4~7の範囲なので,英字か数字のASCIIコードが並んでるだけみたいですね.
2文字ずつ分けてASCIIコードに対応する文字に直してみます.同時に,改行を取り除きます.

def main():
    in_f = open("users_db.txt", 'r')
    out_f = open("users_db_dec.txt", 'w')
    str_lines = in_f.readlines()

    for str_line in str_lines:
        i = 0
        while True:
            if(i * 2 + 2 > len(str_line)):
                break
            s = str_line[i*2] + str_line[i*2 + 1]
            out_f.write(chr(int(s, 16)))
            i += 1

if __name__=="__main__":
    main()

ASCIIコードに対応する文字に直した結果...
f:id:verliezer93764:20190204233127p:plain
語尾が=になっており,base64エンコードされた文字列っぽいですね.これをbase64デコードすると,jsonっぽいデータがでてきます.この中にフラグがあります.
f:id:verliezer93764:20190204233509p:plain
flag{ENC0D1NG_D4TA_1S_N0T_ENCRY7I0N}
まあそうですね...

Binary 2

ログイン認証プログラムを作った人が辞めたのでログイン方法がわからないので調べてくださいという問題.渡されるプログラムEmployee_Payroll.exeは.NETアセンブリで,実行するとユーザーネームとパスワードが要求されます.IDA Free版では解析できず,Ollydbgにも慣れていないので,とりあえず平文ないかなあと思ってbintextに投げてみると,"admin"と"dGhpc19pc19ub3RfdGhlX2ZsYWdfeW91X3NlZWtfa2VlcF9sb29raW5n"という怪しい文字列がありました.
f:id:verliezer93764:20190204234421p:plain
さらに,dnSpyという優秀な.NETデコンパイラがあると聞いたので使用してみると...
f:id:verliezer93764:20190204234918p:plain
f:id:verliezer93764:20190204235123p:plain
これらを見ると,ユーザーネームを"admin"に,パスワードを"dGhpc19pc19ub3RfdGhlX2ZsYWdfeW91X3NlZWtfa2VlcF9sb29raW5n"として入力した場合は何か文字列の載っているメッセージウィンドウを表示する,そうでないと"Username or Password is incorrect, please try again"と表示し,3回目には"Too many login attempts"とメッセージウィンドウを表示することが予想できます.また,ログイン成功時に表示されると思われる文字列を調べると,先頭が"flag"でした.
f:id:verliezer93764:20190206133816p:plain
ユーザーネームをadminに,パスワードをdGhpc19pc19ub3RfdGhlX2ZsYWdfeW91X3NlZWtfa2VlcF9sb29raW5nとして入力した場合,フラグが出ました.dnSpy,すごいですね!
f:id:verliezer93764:20190206134017p:plain
flag{ST0RING_STAT1C_PA55WORDS_1N_FIL3S_1S_N0T_S3CUR3}
あとはollydbgに慣れていかないといけないですね.

Binary 3

一見正常に動作しているログイン認証プログラムが,どこかおかしい?らしいです.ELFファイルが渡されます.
ltraceしてみると普通にstrcmpで判定しているようです.
f:id:verliezer93764:20190206140433p:plain
usernameに"admin",passwordに"a2VlcCBsb29raW5nLCBub3QgdGhlIGZsYWc="を指定したら"ログイン"できました.
f:id:verliezer93764:20190206140718p:plain
しかし,それ以外に特に何も起きず,たしかにログイン部分だけは正常に動いてそう...
なので,もしかすると他に実行されるべき関数があるかもしれないと思い、IDAFree版で調べてみることにしました.
すると,"www.gr3yR0n1n.com"や"GET %s HTTP/1.0"のHTTP通信機能を思わせるような文字列や,いくつかの独自のサブルーチン群がありました.このうち,サブルーチン'd'には,socket,gethostbyname,htons,connect,write,closeなど一連の通信を行うと思われる部分がありました.これを実行させてみることにします.
f:id:verliezer93764:20190206143127p:plain
"you are now logged in..."のところがログイン成功部分なので,おそらくint main(){ ... return 0; }の return 0;を示すであろうmov eax,0の部分付近をサブルーチンdのcallや諸命令に書き換えようかなと思いましたが,アドレスがわからなかったので,GDBでそこまで進んだ後ripを書き換えてサブルーチンdに移動することにしました.

root@kali:~/Desktop/CTF/NeverLANCTF2019# gdb -q ./get_flag
Reading symbols from ./get_flag...(no debugging symbols found)...done.
gdb-peda$ b main
Breakpoint 1 at 0x24c0
gdb-peda$ run
Starting program: /root/Desktop/CTF/NeverLANCTF2019/get_flag 































[----------------------------------registers-----------------------------------]
RAX: 0x5555555564bc (<main>:	push   rbp)
RBX: 0x0 
RCX: 0x7ffff7f8e718 --> 0x7ffff7f8fd80 --> 0x0 
RDX: 0x7fffffffe108 --> 0x7fffffffe443 ("CLUTTER_IM_MODULE=xim")
RSI: 0x7fffffffe0f8 --> 0x7fffffffe418 ("/root/Desktop/CTF/NeverLANCTF2019/get_flag")
RDI: 0x1 
RBP: 0x7fffffffe010 --> 0x555555556540 (<__libc_csu_init>:	push   r15)
RSP: 0x7fffffffe010 --> 0x555555556540 (<__libc_csu_init>:	push   r15)
RIP: 0x5555555564c0 (<main+4>:	sub    rsp,0x20)
R8 : 0x7ffff7f8fd80 --> 0x0 
R9 : 0x7ffff7f8fd80 --> 0x0 
R10: 0x0 
R11: 0x0 
R12: 0x555555554cc0 (<_start>:	xor    ebp,ebp)
R13: 0x7fffffffe0f0 --> 0x1 
R14: 0x0 
R15: 0x0
EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x5555555564bb <d+533>:	ret    
   0x5555555564bc <main>:	push   rbp
   0x5555555564bd <main+1>:	mov    rbp,rsp
=> 0x5555555564c0 <main+4>:	sub    rsp,0x20
   0x5555555564c4 <main+8>:	mov    DWORD PTR [rbp-0x14],edi
   0x5555555564c7 <main+11>:	mov    QWORD PTR [rbp-0x20],rsi
   0x5555555564cb <main+15>:	mov    DWORD PTR [rbp-0x4],0x0
   0x5555555564d2 <main+22>:	mov    eax,0x0
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffe010 --> 0x555555556540 (<__libc_csu_init>:	push   r15)
0008| 0x7fffffffe018 --> 0x7ffff7df709b (<__libc_start_main+235>:	mov    edi,eax)
0016| 0x7fffffffe020 --> 0x0 
0024| 0x7fffffffe028 --> 0x7fffffffe0f8 --> 0x7fffffffe418 ("/root/Desktop/CTF/NeverLANCTF2019/get_flag")
0032| 0x7fffffffe030 --> 0x100040000 
0040| 0x7fffffffe038 --> 0x5555555564bc (<main>:	push   rbp)
0048| 0x7fffffffe040 --> 0x0 
0056| 0x7fffffffe048 --> 0xd24ee335a7a47c25 
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value

Breakpoint 1, 0x00005555555564c0 in main ()
gdb-peda$ disass main
Dump of assembler code for function main:
   0x00005555555564bc <+0>:	push   rbp
   0x00005555555564bd <+1>:	mov    rbp,rsp
=> 0x00005555555564c0 <+4>:	sub    rsp,0x20
   0x00005555555564c4 <+8>:	mov    DWORD PTR [rbp-0x14],edi
   0x00005555555564c7 <+11>:	mov    QWORD PTR [rbp-0x20],rsi
   0x00005555555564cb <+15>:	mov    DWORD PTR [rbp-0x4],0x0
   0x00005555555564d2 <+22>:	mov    eax,0x0
   0x00005555555564d7 <+27>:	call   0x555555554eb7 <c>
   0x00005555555564dc <+32>:	mov    eax,0x0
   0x00005555555564e1 <+37>:	call   0x555555554dca <u>
   0x00005555555564e6 <+42>:	mov    DWORD PTR [rbp-0x4],eax
   0x00005555555564e9 <+45>:	cmp    DWORD PTR [rbp-0x4],0x0
   0x00005555555564ed <+49>:	jne    0x555555556502 <main+70>
   0x00005555555564ef <+51>:	lea    rdi,[rip+0x149]        # 0x55555555663f
   0x00005555555564f6 <+58>:	call   0x555555554b90 <puts@plt>
   0x00005555555564fb <+63>:	mov    eax,0x0
   0x0000555555556500 <+68>:	jmp    0x555555556539 <main+125>
   0x0000555555556502 <+70>:	mov    eax,0x0
   0x0000555555556507 <+75>:	call   0x555555554e42 <b>
   0x000055555555650c <+80>:	mov    DWORD PTR [rbp-0x4],eax
   0x000055555555650f <+83>:	cmp    DWORD PTR [rbp-0x4],0x0
   0x0000555555556513 <+87>:	jne    0x555555556528 <main+108>
   0x0000555555556515 <+89>:	lea    rdi,[rip+0x137]        # 0x555555556653
   0x000055555555651c <+96>:	call   0x555555554b90 <puts@plt>
   0x0000555555556521 <+101>:	mov    eax,0x0
   0x0000555555556526 <+106>:	jmp    0x555555556539 <main+125>
   0x0000555555556528 <+108>:	lea    rdi,[rip+0x138]        # 0x555555556667
   0x000055555555652f <+115>:	call   0x555555554b90 <puts@plt>
   0x0000555555556534 <+120>:	mov    eax,0x0
   0x0000555555556539 <+125>:	leave  
   0x000055555555653a <+126>:	ret    
End of assembler dump.
gdb-peda$ b *0x0000555555556534
Breakpoint 2 at 0x555555556534
gdb-peda$ c
Continuing.
username: admin
password: a2VlcCBsb29raW5nLCBub3QgdGhlIGZsYWc=
you are now logged in...

[----------------------------------registers-----------------------------------]
RAX: 0x19 
RBX: 0x0 
RCX: 0x7ffff7ebd874 (<__GI___libc_write+20>:	cmp    rax,0xfffffffffffff000)
RDX: 0x7ffff7f908c0 --> 0x0 
RSI: 0x555555758260 ("you are now logged in...\n")
RDI: 0x0 
RBP: 0x7fffffffe010 --> 0x555555556540 (<__libc_csu_init>:	push   r15)
RSP: 0x7fffffffdff0 --> 0x7fffffffe0f8 --> 0x7fffffffe418 ("/root/Desktop/CTF/NeverLANCTF2019/get_flag")
RIP: 0x555555556534 (<main+120>:	mov    eax,0x0)
R8 : 0x7ffff7f95500 (0x00007ffff7f95500)
R9 : 0x7ffff7f908c0 --> 0x0 
R10: 0x7ffff7ff06a0 (<strcmp+2864>:	pxor   xmm0,xmm0)
R11: 0x246 
R12: 0x555555554cc0 (<_start>:	xor    ebp,ebp)
R13: 0x7fffffffe0f0 --> 0x1 
R14: 0x0 
R15: 0x0
EFLAGS: 0x202 (carry parity adjust zero sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x555555556526 <main+106>:	jmp    0x555555556539 <main+125>
   0x555555556528 <main+108>:	lea    rdi,[rip+0x138]        # 0x555555556667
   0x55555555652f <main+115>:	call   0x555555554b90 <puts@plt>
=> 0x555555556534 <main+120>:	mov    eax,0x0
   0x555555556539 <main+125>:	leave  
   0x55555555653a <main+126>:	ret    
   0x55555555653b:	nop    DWORD PTR [rax+rax*1+0x0]
   0x555555556540 <__libc_csu_init>:	push   r15
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffdff0 --> 0x7fffffffe0f8 --> 0x7fffffffe418 ("/root/Desktop/CTF/NeverLANCTF2019/get_flag")
0008| 0x7fffffffdff8 --> 0x155554cc0 
0016| 0x7fffffffe000 --> 0x7fffffffe0f0 --> 0x1 
0024| 0x7fffffffe008 --> 0x100000000 
0032| 0x7fffffffe010 --> 0x555555556540 (<__libc_csu_init>:	push   r15)
0040| 0x7fffffffe018 --> 0x7ffff7df709b (<__libc_start_main+235>:	mov    edi,eax)
0048| 0x7fffffffe020 --> 0x0 
0056| 0x7fffffffe028 --> 0x7fffffffe0f8 --> 0x7fffffffe418 ("/root/Desktop/CTF/NeverLANCTF2019/get_flag")
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value

Breakpoint 2, 0x0000555555556534 in main ()
gdb-peda$ p d
$1 = {<text variable, no debug info>} 0x5555555562a6 <d>
gdb-peda$ set $rip=0x5555555562a6
gdb-peda$ c
Continuing.
GET /81c26d1dd57fd11842fc13e53540db80/eacbe4d1b2dee530eee7460477877c4d/667d5fa72f80788a5ed2373586e57ff6/c4ff45bb1fab99f9164b7fec14b2292a/6470e394cbf6dab6a91682cc8585059b HTTP/1.0


Program received signal SIGSEGV, Segmentation fault.

[----------------------------------registers-----------------------------------]
RAX: 0x7ffff7dcbec8 --> 0x7 
RBX: 0x7fffffffb408 --> 0x7fffffffb688 ("libnss_files.so.2")
RCX: 0x0 
RDX: 0x0 
RSI: 0x55555575c890 --> 0x7ffff7ffe450 --> 0x7ffff7f94520 --> 0x7ffff7ffe190 --> 0x555555554000 --> 0x10102464c457f 
RDI: 0x55555575c530 --> 0x7ffff7dbe000 --> 0x10102464c457f 
RBP: 0x7fffffffb228 --> 0x7fffffffb2b8 --> 0x80000002 
RSP: 0x7fffffffb128 --> 0x55555575c530 --> 0x7ffff7dbe000 --> 0x10102464c457f 
RIP: 0x7ffff7fe0988 (<_dl_relocate_object+280>:	)
R8 : 0x7ffff7dbf0e8 --> 0x5f6e6f6d675f5f00 ('')
R9 : 0x0 
R10: 0x555555758010 --> 0x1000000000000 
R11: 0x55555575c530 --> 0x7ffff7dbe000 --> 0x10102464c457f 
R12: 0x0 
R13: 0x0 
R14: 0x0 
R15: 0x0
EFLAGS: 0x10246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x7ffff7fe0977 <_dl_relocate_object+263>:	nop    WORD PTR [rax+rax*1+0x0]
   0x7ffff7fe0980 <_dl_relocate_object+272>:	mov    rax,QWORD PTR [r11+0x78]
   0x7ffff7fe0984 <_dl_relocate_object+276>:	pxor   xmm0,xmm0
=> 0x7ffff7fe0988 <_dl_relocate_object+280>:	
    movaps XMMWORD PTR [rbp-0x70],xmm0
   0x7ffff7fe098c <_dl_relocate_object+284>:	
    movaps XMMWORD PTR [rbp-0x60],xmm0
   0x7ffff7fe0990 <_dl_relocate_object+288>:	
    movaps XMMWORD PTR [rbp-0x50],xmm0
   0x7ffff7fe0994 <_dl_relocate_object+292>:	
    movaps XMMWORD PTR [rbp-0x40],xmm0
   0x7ffff7fe0998 <_dl_relocate_object+296>:	test   rax,rax
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffb128 --> 0x55555575c530 --> 0x7ffff7dbe000 --> 0x10102464c457f 
0008| 0x7fffffffb130 --> 0x7ffff7e586da (<__libc_calloc+762>:	mov    r8,rax)
0016| 0x7fffffffb138 --> 0x8 
0024| 0x7fffffffb140 --> 0x0 
0032| 0x7fffffffb148 --> 0x7ffff7dbfbd8 --> 0x3000009691a75 
0040| 0x7fffffffb150 --> 0x7ffff7debf1c --> 0x1000200000001 
0048| 0x7fffffffb158 --> 0x7 
0056| 0x7fffffffb160 --> 0xf7fe5a40 
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x00007ffff7fe0988 in _dl_relocate_object (scope=0x55555575c890, 
    reloc_mode=reloc_mode@entry=0x0, 
    consider_profiling=consider_profiling@entry=0x0) at dl-reloc.c:258
258	dl-reloc.c: そのようなファイルやディレクトリはありません.
gdb-peda$ 

GET
/81c26d1dd57fd11842fc13e53540db80/eacbe4d1b2dee530eee7460477877c4d/667d5fa72f80788a5ed2373586e57ff6/c4ff45bb1fab99f9164b7fec14b2292a/6470e394cbf6dab6a91682cc8585059b HTTP/1.0
という,HTTPのリクエストヘッダが出てきました.これを先ほどの"www.gr3yR0n1n.com"にくっつけてパス指定のURLとし,アクセスしてみます.
f:id:verliezer93764:20190206153132p:plain
本当はこういう怪しい通信プログラムを調べるのはFakenetなどを通してやってみるべきなんでしょうけどね.
flag{AP1S_SH0ULD_4LWAYS_B3_PR0T3CTED}