kanyewest CTF

勉強したことをメモしています。

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というファイルに答えが書いてあったようです。