Qualsに参加しました。みんなでまじめに参加して、結果はなんとか10位となりました。アドベントカレンダー登録時の予定では、Web問あたりがいくつか解けて、ここでwriteupを書くはずだったんですが、かなりエスパー要素があるわ1問あたりの段階数がおおいやらで、全体的にいいところまでは進めても解ききれませんでした。cr4cKM3のwriteupを書きます。ctfzone{FLAG_HERE}).m394Dr1V3_cr4cKM3.zip調査まずfileを打ちます。CTFZONE)そっかーっつってWindowsでMegaDriveのエミュレータ/デバッガを探してきます。Exodusってやつを使いました。逆アセンブリもブレークポイントもついていて、メモリエディタも揃ってるのでとてもいい感じです。Toだけでかなり事足ります。crackmeの問題自体は、矢印ボタンで16桁のパスワードを入力して、Aボタンを押すとパスワード判定が走るよくあるやつです。0x5Aの範囲のようです。Retroとかいうサイトを参考にしました。メモリマッピングはとても大事です。あとはGHIDRAでアセンブリ読解をします。GHIDRAの逆コンパイラはだいぶ参考にならなかった気がします。いや俺が悪いのか?きっとそうなんだろうな。なんだかコード領域をデータ領域と誤解して、リファレンス解析とかにかなり失敗するのですが、たぶん最適ムーブは初心に戻ってstringsするところからです。again...!ということで016153をROMイメージから検索します。アドレス0x0d21がヒットします。見事にGHIDRAはただのデータとして解析していますが、無理やりDでコード片として解析させます。上の方にスクロールすると、すごーくパスワード判定ロジック的ななにかが見えます。lslなどで算術演算を行ったあとに、cmpとbranchを繰り返すあれです。ないが算術演算の回数が多すぎて人力でやれるものじゃないので、Z3の制約式に変換して解かせることにします。解みんな大好きZ3で解を出すために、制約生成器をRubyで書きました。03_input.diasasm)です。メモリ初期化および最後の比較の場所は、大した量じゃないので手でRubyコードに埋め込みます。算術演算を、ひたすらPythonに置換します。newvは、こないだTSGゴルフ大会でunlambda生成器を作ったときに習得したidiomですが、手軽に連番を生成できて便利です。02_constraints.py)を実行すると、めでたく解がでてきます。矢印キー操作もかなりむずいので、雑にエミュレータのメモリエディタからRAM:0x000000に算出されたパスワードを書き込むと、めでたくフラグが出てきます。*1:ちょっと僕の世代にはセガのハードの区別はつかないので、競技中はずっと脳内でどこかで見た「せがた三四郎」のCMの曲が流れてました。gacha...TSGで出ました。本戦は僕は出れません。Calendarの4日目の記事として書かれました。rop0)月別アーカイブはてなブログをはじめよう!cookie-sさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。