Backdoor CTF 2017 writeup
m1z0r3で出てました。2050点で21位、個人的には以下の6問を解きました。
ジャンルは適当につけて、実際に解いた順ではなくジャンルでソート。
・complex rsa (200, crypto)
・stereotypes (点数忘れた, crypto)
・imagerev (点数忘れた, crypto)
・baby-0x41414141 (150, pwn)
・just-do-it (250, pwn)
・funsignals (点数忘れた, pwn)
問題数が多いので雑にいきます。めんどくさいのでソルバも省略。
complex rsa
「RSAは破られることがあるらしいから2回も暗号化したったwww」みたいな問題文。
2つの公開鍵と暗号文が渡される。公開鍵のパラメータを見てみると、nの値が等しくeの値は異なる。RSA暗号の性質上、同じ法の元でe1,e2を用いて暗号化するということは、e = e1 × e2 % n を用いて暗号化したに等しい。
そこでeを計算してみるとそこそこ大きな値になるので、wiener's attackをして終了。
stereotypes
以下の3つのファイルが渡される
・plaintext:文末がちょっとだけ伏せられた平文
・ciphertext:暗号文
・pubkey:RSA公開鍵
明らかにstereotyped message attackなのでやるだけ。
imagerev
encrypt.pyを見ると読む気がなくなるほどめんどくさそう。
が、怪しげな数字のリストが目に付くのでググると、SHA256の実装っぽいことがわかる。つまり、画像のpixel毎にRGB値を SHA256(chr(R)+chr(G)+chr(B))としている暗号もどき。
通常ハッシュの逆算は不可能だが、今回は平文空間が256^3程度しかないので計算可能。予めテーブルを作っておき、暗号文を64バイトずつ切り出していけば平文が求まる。
あとは、全ピクセル数からいい感じの縦横比をguessして画像に起こせばフラグが書いてある。
baby-0x41414141
buf = read();
printf(buf);
exit();
という感じのプログラム。
ご丁寧にフラグ出力用の関数が用意されているので、書式文字列攻撃によってexitのGOTをフラグ出力関数に書き換えて終了。
フラグ出力関数がある問題が久々すぎて、どっかに/bin/sh用意してsystem呼んでってやろうとしてて30分くらい無駄にした。
just-do-it
自明なbofがあるので、writeへret2pltして適当にlibcのアドレスをリークさせた後、ret2libcでsystemを呼んでおしまい。
やるだけ。
funsignals
readを呼んだ後、読み込んだものを引数にsigreturnを呼ぶ。
sigreturnの引数は自由に操れるので、いわゆるSROPの簡単なバージョン。
フラグは実行ファイル中に書かれているので、sigreturnでwriteを呼べばフラグが出力される。
しばらくなぜかraxだけうまくセットされずに悩み、結局よくわからないところに積んだ値がraxになったのでそれで解いた。
まとめ
(有名どころと比べると)レベル感としては比較的易しめだった。24hで5人制限と考えればこんなものかも?
extend meも手をつけていたものの、ナンチャラアタックすらいらないとは思わなかった。とはいえlength extensionしても解けるはずなのに解けてなくてつらい...
ローカルでは解けたんや... リモートじゃ解けないけど...
あとがき
解いたけどwriteup書いてない問題が5問ぐらい溜まってるのでそのうち消化します