#129 [HTB] Debugme
Hack The BoxのReversing問題「Debugme」を解きました。アンチデバッグ技術をテーマにした問題です。
アンチデバッグ技術には様々なものがありますが、例をあげると、
デバッグフラグをチェックする
処理間の時間を計測する
プログラムやデータを暗号化する
無駄な処理を埋め込む
などがあります。これらのデバッグ対策をうまく回避できなければ、効率的に調査できません。
Walk Through
1.静的解析
与えられたファイルをGhidraでデコンパイルすると、x32のPEファイルだとわかります。ヒントになるような文字列も含まれていません。x64dbgで動的解析してみます。
2. PEB BeingDebugged
処理を追ってみますが、途中で止まってしまいます。
PEBのBeingDebuggedフラグを確認して、0でない場合はエラーとしているようです。
これは、jne -> jeに書き換えることで回避できます。
3. PEB NtGlobalFlag
少し進めると、同様にNtGlobalFlagを確認してエラーとなってしまいます。
これも、jne -> jeに書き換えます。
4. RDTSC
さらに進んでいくと、rdtsc命令が現れます。rdtscは、時間を計測する命令で、CPUのクロック数を取得してEAXとEDXに保存します。プログラムを見ると、2ヶ所でrdtscが実行され、その差分が大きすぎる場合はエラーになるとわかります。
jgの処理をnopに書き換えてしまえば問題ありません。
5. XORでプログラム復号
ここまで来ると、xorを使って暗号化されていたプログラムが復号されます。その後、復号されたプログラムに処理が移ります。
ここでも2,3,4と同様の対策がなされているので、同じように回避します。
6. XORでフラグ復号
ここまで来ると、フラグの復号処理に入ります。
フラグはDSに展開されます。
まとめ
Reversingは手を動かさなければ身につきませんね。Debugmeで使われていたアンチデバッグ技術は単純なものでした。実際には、パッカーが使われたり、VM環境の検知が行われたりと、解析にさらに高度な技術が必要になるでしょう。
ちょっとアセンブリが身についてきて自信がつきました。もっと手を汚してがんばります!
EOF
この記事が気に入ったらサポートをしてみませんか?