CTF-writeup

My CTF Writeups. (written in Japanese)

View on GitHub

picoCTF 2022 Writeup

目次

Forbidden Paths

相対パスを使う。 ../../../../flag.txt

SQL Direct

DBに接続して\dからのselect * from flags

CookieのisAdminを1にして読み込む。

Roboto Sans

robots.txtを見るとBase64エンコードされたパスがあるのでデコードしてそこにアクセス。

Secrets

ソースコードを眺めるとsecretという謎のパスが一段入ってるものが見つかる。アクセスして順に同じことをやるとたどり着く。

SQLiLite

シンプルなSQLインジェクション。

Search source

CSSファイル内のコメントにフラグがある。

flag leek

フォーマットストリング攻撃ができるので読み出す。
echo 'AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ:%36$p' | ./vuln

File types

ファイルの中身を見るとshell archive(shar)というものらしい。shで解凍するとarという圧縮形式のファイルが出てくる。アーカイバをインストールして解凍すると次はcpioという形式のファイルが出てくる。bzip2、gzip、lgipと続いてそろそろ終わりかと思うがまだ終わらない。ASCII textと出てくることを願いながらfileコマンドを叩いて、アーカイバをインストールし解凍して、を繰り返すとLZ4、LZMA、lzop、lzip、XZで終わる。途中でやめようか迷った。

RPS

ソースコードを読むとsrand(time(0))があり、これはタイミング攻撃が可能。手元でも同じようにsrand(time(0))rand() % 3を出力するCのコードを書いてコンパイルする。Pythonからその実行ファイルを呼び出して勝つ手を出すスクリプトを書いて実行してみるが絶妙にサーバー側と時間がズレていて何度も調整するがなかなか綺麗に合わせられない。ズレがあるとは言え1秒間の間では同じ手が出されるため連勝はしやすい。最終的に完璧な調整は諦めて運よく5連勝できることを待つという方法でフラグをゲット。

buffer overflow 0

適当に長い文字列を入力に渡すとフラグが貰える。

buffer overflow 1

win関数に飛ばせばフラグが貰える。objdump -d vulnなどでwinのアドレスを確認し、バッファオーバーフローでvulnのリターンアドレスをwinのアドレスに書き換える。

buffer overflow 2

これもwin関数に飛ばせばフラグが貰える。しかしwin関数に2つの引数(arg1とarg2)に正しい値を渡さないとフラグが貰えない。vulnのリターンアドレスをwinのアドレスに書き換えるとして、winのアドレスの次にarg1とarg2を置けばフラグが出力される。ここでリモートで試してみるがフラグが貰えない。GDBで試すとどうやらwinのあとにリターンアドレスでarg1を参照してセグフォで落ちている模様。0x804945あたりにpopを4回してretしているありがたいgadgetがあるので、popで引数2個分スタックポインタをずらして、mainのアドレスにリターンさせる。
ペイロードはこんな感じになる。b"A" * (buf_size + 8) + base_addr + win_addr + pop_addr + arg1 + arg2 + main_addr

x-sixty-what

64bitでのBoF。Pwn初心者なのであまり正しく理解できている自信はないが、Intel CETという機能があり、jmp/callでendbr32/64以外の場所に飛べなくする機構があるらしい(参考リンク: 【pwn 36.0】Intel CETが、みんなの恋人ROPを殺す)。flag関数でフラグが貰えるのでBoFでflag関数に飛ばしたあとにmainに飛ばせばフラグゲット。

Fresh Java

classファイルをデコンパイルするとフラグを1文字ずつ検証するコードが出てくる。ハードコードされているのでフラグゲット。

Bbbbloat

特定の数値を渡すとフラグが貰える実行ファイルらしい。Ghidraでデコンパイルすると数値がわかる。

unpackme

UPXでパックされているのでまずアンパックする。若干難読化されているがBbbbloatとほとんど変わらない動作をする実行ファイルが出てくる。Ghidraでデコンパイルしても見づらかったのでIDA Freeを使うと綺麗にデコンパイルされて数値がわかる。GhidraとIDA Freeを適材適所で使い分けられると便利かもしれない。