Trend Micro CTF 2020に出た話
時は9月中旬~
Trend MicroがCTFやってるよって友人に話しかけたところ、2日でチーム作ってたので参加。
そこからTry Hack Meや脆弱性調べたりしてなんやかんや。。。
予選(10/3~4)
結論から言うと爆死してチームメンバー全員一問も解けませんでした。
まあこれでも少しは頑張ってたので少なくとも僕がやったことは日記にします。はい。
Reversing II - 100
友人CがReversing I、友人GがIoT&MLの問題に挑戦し始めたので、自分はReversing IIの問題へ。
どうやらとあるゲームの壁抜けを行うGame Genie という8文字のチートコードを作成してほしいというお題。
DLしてきたときに出たファイルが「impossible_game.nes」
... nesファイル is 何?
調べた
どうやら「Nintendo Entertainment System」というファイルらしい。
つまり、任天堂さんが扱っているファイルで、ファミコンとかで使われているらしい。
hmhm、なるほど。
で、どうしろと?
とりあえず
手を止めてても仕方ないのでghidraに入れて確認...しようとしたところでコンパイラのフォーマットを知らない。
どれだ?
ファミコン
ファミコンのファイルらしいしファミコンのCPUを調べたらいいかと考えWikipedia先輩へ。
ja.wikipedia.org
実行環境
ダラダラ中身見ててもようわからんかった。ふと実行環境ほしいなと思いましてファミコンのエミュレータ探し。
ファミコンエミュレータで検索し、出てきたものを片っ端から入れて実行して確認とかした結果、FCEUXとかいうのが分かりやすかったので使用。
fceux.com
... これメモリの中身を見たりいじれたりバイナリ見れたり優秀じゃん。Game Genie Encoder/Decoderとかいうツールもついていたのでこいつだけで良くね?
ゲームをいじってみる。
実際の作業画面はこちら。(真ん中がゲーム画面)
確かにこれは壁抜けのチートコードが必要ですね。。。
これ以上右に行かんわ。
メモリをいじってみる
メモリの中身を見ていると、どうやら一番右に行くと-94を取る値がX軸の変化に応じて動いている気がする。
上からメモリ内の値を固定してゲーム画面にどんな影響があるか確認してみると、003Cの値をいじったところで壁抜けが成功。
あれ?僕何かやっちゃいました?
勝ったと思ったか?
意気揚々と8文字に合わせて$003C:A5と打ったらFaild。
どうやらGame Genie codeを入れないといけない模様。
というか、Game Genie codeって何?
Game Genie code
どうやらGame Genieというファミコンのチートを行うための周辺機器が米国カナダ辺りで売られていた様子。
任天堂の訴えで米国では差し止められたがカナダで売られ続けたとかいうサブ知識も得ることができたけど使いどころは不明。
Game Genie code自体は「6文字」と「8文字」のコードがある模様。
それぞれ仕組みがあるらしいけど、僕にとって問題だったのがメモリが8000番以上の場所しか扱えないところ。
...いや、003Cは8000とは程遠いんだが?
急遽Game Genieの勉強
Game Genieを調べていたらよさげなYoutube動画を見つけたのでこれを使ってお勉強。
分かったこととしては、8000以下の値を扱っている場所が8000番以降にあるらしいので、そこのコマンドを変更して値の更新を捻じ曲げたらいい感じになるとのこと。
www.youtube.com
また、メモリをいじっていたところ0040の値を16以上に変更すると大きく反発し、0以下に変更すると壁の部分で落ちながら透過することが判明。
もしかしてこいつが壁の当たり判定の値持っているのか?
アセンブリ読み
アセンブリ言語で003Cと0040の値を扱っている場所をリストアップし、逐一変更。
動画の内容を参考に、もともとあったコマンドから変更するべきと書いてあったコマンドのopcodeを調べ、変更をする...が、ダメ。
追記
Writeup上がってました。
変えるべきメモリは0031だったようです。
完璧ノーマーク。
github.com