きゅうり。

主にCTF関係のことを書いていく気がします

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問ぐらい溜まってるのでそのうち消化します