NeverLAN CTF 2019 参加記録
01/31~02/03にかけて行われたNeverLAN CTF 2019に参加しました!久しぶりにフルで参加できるぞ~,と張り切っていましたが用事が発生してしまいあまりできませんでした…( ノД`)シクシク…
Binary問がちょっと普段と違う雰囲気の問題で面白かったです.
Binary 1
データが暗号化されてしまったようなので元に戻してくださいという問題.users_dbというテキストファイルが渡されます.
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コードに対応する文字に直した結果...
語尾が=になっており,base64でエンコードされた文字列っぽいですね.これをbase64デコードすると,jsonっぽいデータがでてきます.この中にフラグがあります.
flag{ENC0D1NG_D4TA_1S_N0T_ENCRY7I0N}
まあそうですね...
Binary 2
ログイン認証プログラムを作った人が辞めたのでログイン方法がわからないので調べてくださいという問題.渡されるプログラムEmployee_Payroll.exeは.NETアセンブリで,実行するとユーザーネームとパスワードが要求されます.IDA Free版では解析できず,Ollydbgにも慣れていないので,とりあえず平文ないかなあと思ってbintextに投げてみると,"admin"と"dGhpc19pc19ub3RfdGhlX2ZsYWdfeW91X3NlZWtfa2VlcF9sb29raW5n"という怪しい文字列がありました.
さらに,dnSpyという優秀な.NETデコンパイラがあると聞いたので使用してみると...
これらを見ると,ユーザーネームを"admin"に,パスワードを"dGhpc19pc19ub3RfdGhlX2ZsYWdfeW91X3NlZWtfa2VlcF9sb29raW5n"として入力した場合は何か文字列の載っているメッセージウィンドウを表示する,そうでないと"Username or Password is incorrect, please try again"と表示し,3回目には"Too many login attempts"とメッセージウィンドウを表示することが予想できます.また,ログイン成功時に表示されると思われる文字列を調べると,先頭が"flag"でした.
ユーザーネームをadminに,パスワードをdGhpc19pc19ub3RfdGhlX2ZsYWdfeW91X3NlZWtfa2VlcF9sb29raW5nとして入力した場合,フラグが出ました.dnSpy,すごいですね!
flag{ST0RING_STAT1C_PA55WORDS_1N_FIL3S_1S_N0T_S3CUR3}
あとはollydbgに慣れていかないといけないですね.
Binary 3
一見正常に動作しているログイン認証プログラムが,どこかおかしい?らしいです.ELFファイルが渡されます.
ltraceしてみると普通にstrcmpで判定しているようです.
usernameに"admin",passwordに"a2VlcCBsb29raW5nLCBub3QgdGhlIGZsYWc="を指定したら"ログイン"できました.
しかし,それ以外に特に何も起きず,たしかにログイン部分だけは正常に動いてそう...
なので,もしかすると他に実行されるべき関数があるかもしれないと思い、IDAFree版で調べてみることにしました.
すると,"www.gr3yR0n1n.com"や"GET %s HTTP/1.0"のHTTP通信機能を思わせるような文字列や,いくつかの独自のサブルーチン群がありました.このうち,サブルーチン'd'には,socket,gethostbyname,htons,connect,write,closeなど一連の通信を行うと思われる部分がありました.これを実行させてみることにします.
"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とし,アクセスしてみます.
本当はこういう怪しい通信プログラムを調べるのはFakenetなどを通してやってみるべきなんでしょうけどね.
flag{AP1S_SH0ULD_4LWAYS_B3_PR0T3CTED}