シェルコード(shellcode)
シェルコード(shellcode)
シェルコード(shellcode)とは?
シェルコード(shellcode)とは特定のプログラムの脆弱性を利用して実行されるコードのことで 通常アセンブラで作成されます。サイズや使用できる命令に制限がある場合が多く作成には それなりの技術が必要になります。
Windows用のシェルコードについて
Unix系OS用のシェルコードの場合には、直接システムコールをシェルコードに直書きする ことが多いのですが、Windowsではシステムコールに直接アクセスする手段が提供されていません。 従ってシェルコードを書く際にも普通のプログラムを書く場合と同様にWindows APIを使って 書いていくことになります。
WindowsというOSではEXEファイル実行される過程で以下のような処理が行われます。
- EXEファイルをメモリにマッピング
- EXEファイルのインポートテーブルを見て、APIのアドレス解決
- EXEファイルを実行
このような仕組みがあるおかげで、WindowsXPでもWindows2000でもWindows98でも 動くようなEXEファイルが存在し得るわけです。これらのOSはまったく別々のOSであり 、当然APIのアドレスが異なります。そういう差異がありながらも同一のEXEが 別のOSでも動くというのにはこういうトリックが隠されているわけです。
※もっと言うとサービスパックの適用状況でもAPIのアドレスが変わることがあります
ここで問題が発生します。シェルコードはEXEファイルのようにOSの助けを借りて 正規の手順を踏んで起動するプログラムではありません。従ってAPIのアドレスを OSに教えてもらうことができません。
一番簡単な対応策は、APIアドレスを直書きすること です。しかしこの方法だと各バージョンごと、各サービスバックごとにシェルコードを書く 必要があります。初期のWindows用シェルコードではこのような手法が用いられていました。 しかしこのような手法を使うと、1つのシェルコードを書くのに何種類ものバージョンを 書かなければいけなくなり、メンテが大変ですし、何より汎用性に欠けます。
そこで動的にAPIアドレスを解決する仕組みが考え出されました。というとシェルコード作成者が考え出したみたい ですが、実際はウィルス作成者たちが考え出したようです。ウィルス作成者達からすると特定のOSの、 特定のサービスパックでしか動かないウィルスなんてのは使いものにならなかったので、どうしても そういう方法を編み出す必要があったという事情があります。具体的には、寄生するプログラムの インポートアドレステーブルを走査して、OSのローダーと同様の処理を自前でやることでAPI アドレスを確定させます。シェルコードの場合は、Exploitを実行させるプログラムのインポートアドレス テーブルを走査してOSのローダーと同様の処理を自前でやってAPIアドレスを確定させます。 その上で本来の処理に移ります。このような機能を実装するためにはPEファイルフォーマットの理解が不可欠です。
※狭義のウィルスは、プログラムに寄生して活動するプログラムであり、シェルコード同様に OSの助けを借りて起動するプログラムではありません。




