09:00まで開催されました。私はチームHarekazeとして参加し、Harekazeは1481点を獲得して33位でした。そのうち5問を私は解いたので、そのwriteupを書こうと思います。warmupセキュリティ機構はいろいろ無効になっています。warmup-b8fa17414a043a62ba16fdeb4f82051d35fc6f434f7130d6d988d6c2d312e73eソースコードを読むと、getsによるスタックオーバーフローとprintfによるFSBがあることが分かります。今回はNXが無効なので、シェルコードを読んで実行するROPを作りました。0x400)sock.sendline(payload)sock.sendline(shellcode)sock.interactive()簡単ですね。flagTWCTF{AAAATsumori---Shitureishimashita.}今気づいたけどフラグが。easy_crack_mewarmupの割に処理が大きかったので脳死angrしてみたら解けなかったので解析しました。心を無にしてC言語に直していくとこんな感じのプログラムであることが分かりました。特定の箇所の文字が特定の文字コードかを確認あとはz3で解かせるのですが、2の条件の付け方が分からなかったので、2の条件はpython側で解いた後に確認し、間違ってたら次の解を見つけるようにしました。(解いた後に教えてもらいました。765ラウンド繰り返します。これを使ってフラグを暗号化したものと、適当な6つのデータとそれらを暗号化したものが渡されます。暗号はよく分からないのでとりあえずpythonで確認したところ、次のようにkの下位数ビットが変わると出力も下位数ビットに影響が大きいようです。0x123432ff)'0x1234cc31'これを利用すれば鍵を下のビットから特定できそうです。今回は鍵を下位から1バイトずつ変え、6つのデータを暗号化したときに正しい暗号文と下位のバイトが一致するものを候補として選んで探索しました。break簡単ですね。flag_enc.png謎バイナリが渡されます。ops)とりあえず公式サイトからVMをダウンロードし、実行はできます。逆アセンブラ的なものが見つからなかったのでブラックボックスで頑張ることにしました。flag_enc.pngと同じサイズの真っ黒な画像と真っ赤な画像を与えたところ、違う色の同じパターンの画像が生成されました。上半分が黒で下半分が赤の画像を与えると、次のようになりました。そんなに難しい暗号化はしていないようです。pixelごとに繰り返していることが分かりました。y方向には鍵が循環しますが、鍵自体は変わりません。鍵は画像によらなかったので、これを使えば元の画像が復元できそうです。復号した結果、次のような画像が出てきました。縦方向にはシャッフルされているようです。いうことで次のコードを使い、座標を色情報として埋め込んだ画像を暗号化して(シャッフルされた状態で)復号しました。b))img.save("shuffle_scrambled.png")これを使えば各座標と色からシャッフルの逆写像が作れます。ebcまた謎バイナリです。Codeなるもので、唯一ebcvmなるものを見つけました。問題バイナリを実行しても"Key:"と出力されて終わるだけでした。callのcodeが0で発行される箇所があり、それが原因で落ちたようです。正しいcallは分からないのでとりあえずcode=0で無を実行して次の命令に移るようにefi.cのhandle_excallを変えます。break;...また、実行した命令をすべて記録するようにexec.cのexec_opの先頭に次の一行を追加します。dump_inst(_vm);この状態で実行したところ、とりあえず入力を与えることができました。実行された命令のダンプを見たところ、0x4006354+i*4に0x4007114+i*4から持ってきたバイト列を特定のxor鍵とXORしてメモリ上にコードを展開していることが分かりました。XORなどで謎演算を繰り返しているコードでした。0x1bfa530d5d685155...展開されたコードをざっと読んだところ、R1にいろんな演算をして、最後にR7と比較して一致しなければダメなことが分かりました。一致した場合は同様に別のコードを同じ場所に展開しています。VMを改造して強制的に合っている判定にしたところ、さらに別のコードが展開されましたが、xor鍵が違うようで変な命令が展開されます。正しいR1を逆算するスクリプトを書いてEBC_1n7eであることが分かったのですが、それをR1や、元のメモリに入れても正しいコードは展開されませんでした。+0)が最初に実行されることが期待できます。これを使って4バイトのxor鍵を特定し、VMのexec_opに次のようなコードを書いて勝手にxor鍵を変更しました。}...すると、正しく次のコードも展開され、また同じようにR1にいろんな演算を適用しているコードでした。これが全部で4ラウンドあるのですが、それぞれ次のような特徴があります。(各ラウンドでxor鍵を求めてVM側から変えました。NEGを使っているので簡単に正しいR1が特定できる一見ORを使っているが、よく見たらRORかROLと等価なことをしているので正しいR1が特定できる何度か特定の1ビットをORして1にしているので、ビットを下げるか適当に判断すればなんとか正しいR1が特定できる何度か複数のビットをORして1にしているので、探索すればR1の候補が複数出る4つ目も正しいと判断されるとTWCTF{入力}が出力されます。3つ目まではなんとかでき、EBC_1n7erpreter_is_m4d3_までは分かりました。最後のラウンドでR1の候補が腐るほどあるので「無理では??」みたいになって数時間死んでいました。最終的には、R1が[a-z0-9_\x00]+に一致するものだけを出力するコードを書き、その大量の出力を見て意味のある単語をguessしたところ、optionalが良さそうと分かりました。opt10n4lが候補リスト中で目にとまったので、TWCTF{EBC_1n7erpreter_is_m4d3_opt10n4l}で送ってみたら正解でした。(は?)カスみたいなコードですが、一応掲載しておきます。}クソみたいな解き方をしてしまったので正攻法が気になる。今回初めてHarekazeと一緒にCTFしました。強い人が多いので正直warmup以外フラグ通せるか不安でしたが、何とかなって安心です。pwn担当ながらheap全然解けない人なので、強いpwnerがいると安心して任せられますね。(いろいろ考えたけど私は解けなかった。1はmiscで出してくれればもっと時間割いて試したと思うし、gccの問題なので解けたかもしれないと思うと悔しいです。Asterisk-AllocとかSecurKarteは(h_nosonさんの)exploit見たらなるほどなーってなったので自力で解けなきゃダメだなーと反省しています。疲れましたが楽しかったです。運営のみなさんもお疲れ様でした。Writeup月別アーカイブはてなブログをはじめよう!ptr-yudaiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。