So-net無料ブログ作成
検索選択

アンパッキング(IAT再構築を手動で) [RCE]

アンパックの作業通常、下記のような流れになる。

①OEP(Original Entry Point)の探索
②メモリのダンプ
③IAT(Import Address Table)の再構築

①については、UPXのような単純なパッカーであれば
PUSHADとPOPADの対象性に着目すれば難なくOEPに到達できる。
そうでない場合、データセグメントにjmpしたり、
mallocやVirtualAllocした領域にjmpしたりというのを注意深く見ていれば
OEPを探すことができる(ことが多い)。
ちゃんとOEPに到達していれば、コンパイラが出力したような
コードが見えてくるはず。Reverse Engineerの眼力を鍛えておきたい。

②はOllyDdbのプラグインであるOllyDumpの出番。

問題は③。

いつもは「Ollydbg」+「OllyDump」+「ImportRec」で
ささっとIATを再構築するものの、たまにうまくできないこともある。
というより、どうやってIATを再構築しているのかを理解しておくことが
大事なのだが、ツールに頼っていると、ここがいささかおろそかになる。

というわけで、今回はIAT再構築を手動で行うことにする。

参考:http://ruffnex.oc.to/kenji/crackme/reverse_engineering.html

やることはそんなに難しくない。
・ダンプしたバイナリをバイナリエディタで読み込み
・IATの場所を探す
・IATの値をロード前の状態に戻す

そもそも、なぜIATを再構築する必要があるのか。

IATには、プログラムがローダに読み込まれたときに
Importされている関数のアドレスが解決された結果が格納されている。
ローダに読み込まれる前は、INT(Import Name Table)と同様の値が
IATにも書き込まれている。
OllyDumpでダンプしたバイナリは、既にローダによって
読み込まれたメモリ領域のダンプなので、IATには
ローダで解決された実際のアドレスが入っていることになる。
そこで、IATを再構築、つまりローダによって改変されたIATの値を
改変される前の状態にすればよいということになる。
したがって、IATの各々が、対応するIMAGE_IMPORT_BY_NAME
値をさすようにしてやればよい。

・OllyDbgでIATを確認し、それぞれがどのAPIに対応しているかメモ。
・バイナリエディタでIATのところにいき、対応するIMAGE_IMPORT_BY_NAME
 の値をさすように修正。
※注意※
IMAGE_IMPORT_BY_NAMEは
typedef struct _IMAGE_IMPORT_BY_NAME {
  WORD Hint;
  BYTE Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

という形をしているので、修正するときには注意する。
直接APIの文字列のアドレスを入れると失敗する。

--

本当はもっとチュートリアルライクに書きたいけど、
面倒になってきたのでまた今度。。。
nice!(0)  コメント(0)  トラックバック(2) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 2

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は1年以上新しい記事の更新がないブログに表示されております。