サムネ線対称ですね(笑)
CTF頑張り中の初心者なので間違っていたり回りくどいことしてるかもしれませんがご了承を
もっといい方法とか教えていただいたら泣いて喜びます
ツール
- IDA(https://qiita.com/kgtakm/items/fc5ee85ca0224a6364e6)
コードの解析に使う。proは金がえぐいのでfreeやdemoを使う。
- OllyDbg(https://www.ollydbg.de/)
ブレークポイントおいて実行とか
- Stirling (https://www.vector.co.jp/soft/win95/util/se079072.html)
バイナリの書き換え
流れ
IDAでコードを解析
IDAでコードを解析します。
デバッグしてみたり、条件分岐のところを探したり、フラグを出力してそうなところを探したりします。
OllyDbgで実行とか
フラグを出力してそうなところにブレークポイントを置いて実行するとフラグを得られることもよくあります。
Stirlingでバイナリ書き換え
条件分岐にnop命令を入れて分岐先を変えたり等
picoCTF 2024 WinAntiDbg0x200(WinAntiDbg0x100)
問題文
WinAntiDbg0x100を解いたことがある人なら、この問題で新しい発見があるだろう。実行ファイルをデバッグして、フラグを見つけてください!
このチャレンジの実行ファイルはWindowsのコンソール・アプリケーションで、Windowsのコマンド・プロンプトを使って実行することから始めることができます。
この実行ファイルには管理者権限が必要です。コマンドプロンプトまたはデバッガーを『管理者として実行』オプションを使って起動するとよいでしょう。
Challengeはこちらからダウンロードできます。アーカイブをパスワードpicoctfで解凍します。
かっこで(WinAntiDbg0x100)としているのは全く同じ方法でこちらの問題も解けるからです。
ステップ1 概要把握
問題文にあるようにIDAを管理者で実行

Newを押してファイルを開く
適当にOK押しまくる

このような画面になったらOK、一回デバッグしてみる。

Debugged application message: ### Level 2: Why did the parent process get a promotion at work? Because it had a “fork-tastic” child process that excelled in multitasking!
Debugged application message: ### Oops! The debugger was detected. Try to bypass this check to get the flag!
なんか書いてあるが、あんまり関係なかった
IDAを眺めていると興味深いものが見つかった

明らかにフラグだ、、、ではどうやってここに行こう??
このフラグの箇所を緑色に変えて少しさかのぼってみると、、、

このようになっていた、重要な個所をわかりやすく色付けしてみる。

デバッグの結果と照らし合わせてみると、黄色のところにいったあと、ピンクのところに行って、
### Oops! といわれているようだ
ではどのようにして緑のところに行こう?
黄色のところの分岐先を変えれば行けそうなので黄色のところをもっとよく見てみる

ここで分岐を表しているのは
test edx, edx
jnz short loc_521832
ここでjnzの意味とかを調べてみると、直前のtestの結果によって分岐先が変わる条件分岐らしい
ここでjnzと対になる、jzというものがあることも分かった
つまり、このjnz命令をjzに変えることができればピンクのところと反対の方向に行くことができる

書き換えた場合の分岐先を見てみると(水色の部分)
もう一度条件分岐があり、一方はピンクへもう一方は緑のフラグの部分へと向かっている。
緑の方へ向かった先のブロックでも条件分岐があるが、この条件分岐は緑と### Something went wrongと書かれているブロックなので何もしなくても緑に行きそうである。
なので黄色の条件分岐プラス、その次の水色の条件分岐を対になる命令に書き換えればフラグを得れそう
ステップ2 Stirlingで書き換え
書き換える命令のところでText viewに切り替える

書き換えるところのアドレスを書き留めておく

ここから説明するバイナリの書き換えはIDA Proがあったら一瞬だし
もっと効率的な方法があると思う…
OllyDbgでファイルを開く
Ctrl + Gで先ほど書き留めたアドレスを入力する

そして、その箇所の16進数の命令も書き留めておく
Stirlingを開く(IDAやOllyDbgを閉じてからじゃないと閲覧だけになってしまう??)

検索から先ほど書き留めた、16進数の命令をページ全体で検索する

複数結果がでると思うけど、前後の16進数をOllyDbgと見比べてあっているところを探す
そして、ちゃんとあっている箇所が見つかったら、いよいよ書き換える。
75という部分がjnzを表しているのでこれをjzを表す74に変える
このような16進数はOllyDbgとかで照らし合わせるとわかる
ちなみにnopは90。
ツールバーの検索・移動から置換を選択して検索データは先ほどのもので置換データで75の部分を74に変える

一括置換をしたら普通のところも置換されるかもしれないから次検索であっているかちゃんと確認してから置換する
同様に、水色のところも置換する
変更を保存して、もう一度IDAで開いてデバッグしてみる。

フラグが得られたーーーー!!