Tiger King CTF 2020【Write-up】
Crypto, Ciphers, and Encodings
Do you feel me?
From Braille
Runcode.ninja
test_tagert
pwn-1
$ file pwn-1 pwn-1: ELF 32-bit LSB pie executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=f817261485d06e5cca3b03c1b998058e922969dd, not stripped
$ checksec.sh --file=./pwn-1 RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFYFortified Fortifiable FILE Full RELRO No canary found NX disabled PIE enabled No RPATH No RUNPATH 84 Symbols No 03 ./pwn-1
実行してみてもFormat String BugsがあるのはわかったのですがFull RELROなのでGOT書き換えられないのでどうしよって一瞬焦りました。
しかし、gdbでアセンブリを読むとそんなことはせずにランダムに生成されてる文字列を入力すればflagが出力されることがわかります。
pwndbg> pdisas main ► 0x565559a5 <main> lea ecx, [esp + 4] 0x565559a9 <main+4> and esp, 0xfffffff0 0x565559ac <main+7> push dword ptr [ecx - 4] 0x565559af <main+10> push ebp 0x565559b0 <main+11> mov ebp, esp 0x565559b2 <main+13> push ebx 0x565559b3 <main+14> push ecx 0x565559b4 <main+15> add esp, -0x80 0x565559b7 <main+18> call __x86.get_pc_thunk.bx <0x56555720> 0x565559bc <main+23> add ebx, 0x15dc 0x565559c2 <main+29> mov eax, dword ptr [ebx + 0x5c] 0x565559c8 <main+35> mov eax, dword ptr [eax] 0x565559ca <main+37> push 0 0x565559cc <main+39> push 2 0x565559ce <main+41> push 0 0x565559d0 <main+43> push eax 0x565559d1 <main+44> call setvbuf@plt <0x565556a0> 0x565559d6 <main+49> add esp, 0x10 0x565559d9 <main+52> sub esp, 0xc 0x565559dc <main+55> push 0 0x565559de <main+57> call time@plt <0x56555630> 0x565559e3 <main+62> add esp, 0x10 0x565559e6 <main+65> sub esp, 0xc 0x565559e9 <main+68> push eax 0x565559ea <main+69> call srand@plt <0x56555670> 0x565559ef <main+74> add esp, 0x10 0x565559f2 <main+77> lea eax, [ebx - 0x1400] 0x565559f8 <main+83> mov dword ptr [ebp - 0xc], eax 0x565559fb <main+86> sub esp, 0xc 0x565559fe <main+89> push dword ptr [ebp - 0xc] 0x56555a01 <main+92> call choose_random_word <0x5655581d> 0x56555a06 <main+97> add esp, 0x10 0x56555a09 <main+100> mov dword ptr [ebp - 0x10], eax 0x56555a0c <main+103> sub esp, 0xc 0x56555a0f <main+106> lea eax, [ebx - 0x13df] 0x56555a15 <main+112> push eax 0x56555a16 <main+113> call puts@plt <0x56555650> 0x56555a1b <main+118> add esp, 0x10 0x56555a1e <main+121> mov eax, dword ptr [ebx + 0x58] 0x56555a24 <main+127> mov eax, dword ptr [eax] 0x56555a26 <main+129> sub esp, 4 0x56555a29 <main+132> push eax 0x56555a2a <main+133> push 0x78 0x56555a2c <main+135> lea eax, [ebp - 0x88] 0x56555a32 <main+141> push eax 0x56555a33 <main+142> call fgets@plt <0x56555610> 0x56555a38 <main+147> add esp, 0x10 0x56555a3b <main+150> sub esp, 8 0x56555a3e <main+153> lea eax, [ebx - 0x13cf] 0x56555a44 <main+159> push eax 0x56555a45 <main+160> lea eax, [ebp - 0x88] 0x56555a4b <main+166> push eax 0x56555a4c <main+167> call strcspn@plt <0x565555f0> 0x56555a51 <main+172> add esp, 0x10 0x56555a54 <main+175> mov byte ptr [ebp + eax - 0x88], 0 0x56555a5c <main+183> sub esp, 8 0x56555a5f <main+186> lea eax, [ebp - 0x88] 0x56555a65 <main+192> push eax 0x56555a66 <main+193> push dword ptr [ebp - 0x10] 0x56555a69 <main+196> call strcmp@plt <0x565555d0> 0x56555a6e <main+201> add esp, 0x10 0x56555a71 <main+204> test eax, eax 0x56555a73 <main+206> jne main+233 <0x56555a8e> 0x56555a75 <main+208> sub esp, 0xc 0x56555a78 <main+211> lea eax, [ebx - 0x13cd] 0x56555a7e <main+217> push eax 0x56555a7f <main+218> call puts@plt <0x56555650> 0x56555a84 <main+223> add esp, 0x10 0x56555a87 <main+226> call flag <0x5655592c> 0x56555a8c <main+231> jmp main+269 <0x56555ab2> 0x56555a8e <main+233> sub esp, 0xc 0x56555a91 <main+236> lea eax, [ebx - 0x13bc] 0x56555a97 <main+242> push eax 0x56555a98 <main+243> call printf@plt <0x565555e0> 0x56555a9d <main+248> add esp, 0x10 0x56555aa0 <main+251> sub esp, 0xc 0x56555aa3 <main+254> lea eax, [ebp - 0x88] 0x56555aa9 <main+260> push eax 0x56555aaa <main+261> call printf@plt <0x565555e0> 0x56555aaf <main+266> add esp, 0x10 0x56555ab2 <main+269> mov eax, 0 0x56555ab7 <main+274> lea esp, [ebp - 8] 0x56555aba <main+277> pop ecx 0x56555abb <main+278> pop ebx 0x56555abc <main+279> pop ebp 0x56555abd <main+280> lea esp, [ecx - 4] 0x56555ac0 <main+283> ret
そして、srand関数もないので、seedを1に設定したことになり、1度rand関数で生成された文字列がわかればずっと同じです。 choose_random_wordでランダムな文字列が生成され、strcmpで比較されて一致すればflagが読めることがわかります。 スタックに積まれてる値はFormat String Bugsで読み込めるので1度その環境でランダムな文字列がわかればflagが読むことができます。
それがわかればあとはスタックの何番目にランダムな文字列が積まれているかを確認して文字列を出力するだけです。 ローカル環境ではteardropでしたが、リモートではtrustworthierでした。
$ echo -e 'trustworthier' | nc 10.0.41.31 9999 What's my word? yay, you got me derp{HOW_IS_BABBY_FORMED_babypwn}
Forensics
Tom Nook Internet traffic Part I
Wiresharkでpcapファイルを読み込むとflag.txtをGETしてることがわかります。
Trainer
全部で22問あってLinuxに関することを勉強しながら解ける問題でした。 grepコマンドやwcコマンド、ssh-rsaなど復習できてよかったんですがよく見たら全部ホームディレクトリのhelpmeというファイルに答えが書いてあったようです。