アイジア

CTF, 情報セキュリティの学んだことメモ

ksnctf27 Lives out

ksnctf.sweetduet.info

exeファイルをダウンロードして実行するとライフゲームというパズル的なものが開始されます。区画を種と見立ててその絶滅やら誕生やらをシミュレーションしてくれるみたいです。

ライフゲーム - Wikipedia

f:id:favoritte15:20180325183621p:plain

説明文にある「Can you switch all the lights off? 」とはこの赤い場所をすべて消してみろということでしょう。

 

<Write up>

99%リバースエンジニアリングの問題だろうと思ってIDAを開きましたが64bitには対応していないらしく怒られてしまいました。OllyDbgもだめ。

64bitを読み込んでくれるデバッガを急遽ダウンロード。

 

 

f:id:favoritte15:20180325190520p:plain

エントリーポイントからトレースしていくとブロックの描画処理と思われる場所が出てきます。

1つ目のブレークポイントからjl命令(赤矢印のところ)まででブロック1つが描画され、それがループ構造になっています。

見た感じRectangle(3つめのブレークポイント)で位置を決めてシステムコールにより

ブロックを描画しているみたいです。

 

ならSelectObject(2つめのブレークポイント)でブロックの色を赤(生存)か白(死滅)かに決めていると思ったのですが中を見てもよくわかりませんでした。

 

そこでブレークポイント1-2の間の処理に注目しました。

cmovne rdx, r14は 「ZF = 0 のときにrdxにr14を転送する」というものです。

f:id:favoritte15:20180325192237p:plain

cmovneの直後にRIPを置いて検証します。

f:id:favoritte15:20180325192613p:plain

f:id:favoritte15:20180325192802p:plain

するとrdxにr14が正常に転送されたときは赤いブロックが、またそうでないとき(こちらの環境ではedx=4E011A09のとき)は白いブロックが描画されることが分かりました。

f:id:favoritte15:20180325193152p:plain

f:id:favoritte15:20180325193334p:plain

ここではすべて白いブロックにしたいので

「cmovne rdx,r14」を「mov edx, 4E011A09」に書き換えます。(nopでもうまくいきました)

f:id:favoritte15:20180325193731p:plain

真っ白になりました。

 

このままでは描画処理が終わらないので必要に応じてジャンプ命令をnopに変えてループ処理をつぶしていきます。

f:id:favoritte15:20180325194234p:plain

 

「TextoutW」まで来ると、左上にflagが出てきます。