見出し画像

#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

この記事が気に入ったらサポートをしてみませんか?