Who redirected us to the shellcode? 」より
March 10,2009 posted by Moti Joseph,Security Researcher

 WebサイトやPDF,Microsoft Officeファイル,Flashファイルに,「ヒープ・スプレイ」と呼ばれる手口を使ってバッファ・オーバフロー攻撃するエクスプロイトが埋め込まれていることがある。こうしたサイトやファイルを見付けると,必ずある疑問が生まれる。どのモジュール/アセンブリ・コマンドがこのシェルコードを実行しているのか,という疑問だ。

 答えは,関数呼び出し用スタックを調べるだけで簡単に得られることが多い。

 当記事では,筆者お気に入りの32ビット・ユーザー・モード用デバッガ「OllyDbg」を使った調査手順を紹介しよう。

 まず,調査対象シェルコードの最初のアセンブリ・コマンドをブレーク・ポイント用コマンド「INT 3」に書き換える。これにより,シェルコードの実行直前でデバッガの動きを一時停止し,該当プロセスに割り当てられたメモリーの状態を調べられる。

 以下は,最初のアセンブリ・コマンドをINT 3(opcode値は0xCC)に変える前のシェルコードだ。

 INT 3に変えると以下のようになる。

 シェルコード実行後のメモリー状態は,以下の操作で調べられる。このとき,どこからブレーク・ポイントのINT 3コマンドに飛んできたかを知るために,メモリーをLong型で読むことに注意しよう。

 ここで,アドレス「0x664C888」で「0x76B21106」を参照していることが分かる。参照先を逆アセンブルすると,処理をINT 3に飛ばしたモジュール「ATL.DLL」内の「CALL DWORD PTR[EAX+4]」という間接呼び出し処理が現れる。

 補足:シェルコード実行に「JMP」というアセンブリ・コマンドが使われることもある。この場合,関数呼び出し用スタックを調べてもあまり意味がない。その際は,OllyDbgの「Run」トレース機能が役立つだろう。


Copyrights (C) 2009 Websense, Inc. All rights reserved.
本記事の内容は執筆時点のものであり,含まれている情報やリンクの正確性,完全性,妥当性について保証するものではありません。
◆この記事は,ウェブセンスの許可を得て,米国のセキュリティ・ラボの研究員が執筆するブログWebsense Security Labs Blogの記事を抜粋して日本語化したものです。オリジナルの記事は,「Who redirected us to the shellcode? 」でお読みいただけます。