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

f:id:Mikaner:20201006153534p:plain

... nesファイル is 何?

調べた

どうやら「Nintendo Entertainment System」というファイルらしい。
つまり、任天堂さんが扱っているファイルで、ファミコンとかで使われているらしい。
hmhm、なるほど。
で、どうしろと?

とりあえず

手を止めてても仕方ないのでghidraに入れて確認...しようとしたところでコンパイラのフォーマットを知らない。
どれだ?
f:id:Mikaner:20201006155039p:plain

ファミコン

ファミコンのファイルらしいしファミコンのCPUを調べたらいいかと考えWikipedia先輩へ。
ja.wikipedia.org

ふむ、リコー製RP2A03とかいうCPUと。
MOS 6502とかいうものが使われてると。
これか。
f:id:Mikaner:20201006155512p:plain

実行環境

ダラダラ中身見ててもようわからんかった。ふと実行環境ほしいなと思いましてファミコンエミュレータ探し。
ファミコンエミュレータで検索し、出てきたものを片っ端から入れて実行して確認とかした結果、FCEUXとかいうのが分かりやすかったので使用。
fceux.com

... これメモリの中身を見たりいじれたりバイナリ見れたり優秀じゃん。Game Genie Encoder/Decoderとかいうツールもついていたのでこいつだけで良くね?

ゲームをいじってみる。

実際の作業画面はこちら。(真ん中がゲーム画面)
f:id:Mikaner:20201006160905p:plain

確かにこれは壁抜けのチートコードが必要ですね。。。
f:id:Mikaner:20201006161400p:plain
これ以上右に行かんわ。

メモリをいじってみる

メモリの中身を見ていると、どうやら一番右に行くと-94を取る値がX軸の変化に応じて動いている気がする。
f:id:Mikaner:20201006161715p:plain

上からメモリ内の値を固定してゲーム画面にどんな影響があるか確認してみると、003Cの値をいじったところで壁抜けが成功。
f:id:Mikaner:20201006163058p:plain

あれ?僕何かやっちゃいました?

勝ったと思ったか?

意気揚々と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を調べ、変更をする...が、ダメ。

終了

アセンブリの変更で横着している間にタイムアップ。
nesファイルに大敗北を喫しました。

追記

Writeup上がってました。
変えるべきメモリは0031だったようです。
完璧ノーマーク。
github.com