シェルコードは、分解に特定の課題を提示します。多くの場合、それは自己変更し、スタック(シェルコードが配置される可能性が高い場所)にジャンプし、標準の逆アセンブリツールが焦点を当てていない特定の異常なトリックに依存します。
これを念頭に置いて、シェルコードを分解および分析するために使用できるツールは何ですか?
シェルコードは命令の生のブロックにすぎないため、これらのツールは実際には適していません。
ワット?実行可能ファイルも命令の生のブロックです。いえいえ。さて、PE/ELFヘッダーなどのためのデータのビット、または単なるプログラムデータがあるかもしれませんが、データは命令と同じバイナリです。要は、実行可能ファイルのセクションにはラベル(テキスト、データ)が付けられているため、OSは何を何として扱うかを認識しています。
デモの場合、アセンブラーの任意のセットを取り、次のように入力します。
nasm -f bin <asmfile.asm>
これは、アセンブラー命令をオペコードに変換し、それをバイナリー・ファイルに書き留める追加の作業バーを実行することは絶対にありません。これは、ブートローダーなどを作成する方法です。
さて、もしあなたがシェルコードを分析したいなら、あなたがそれを行うことができる多くの方法があります。まず、ハーネスを使用するだけです。
#include <stdio.h>
char shellcode[] = { ... };
int main()
{
int (*function)() = shellcode;
function();
}
できあがりました-gdbなどをシングルステップで実行してください。もちろん、特定のシェルコードを静的に分析したい場合は、その方法もあります。
#include <stdio.h>
char shellcode[] = { ... };
int main()
{
FILE* f = fopen('test.bin', 'wb');
fwrite(shellcode, sizeof(shellcode), f);
fclose(f);
}
これで、使用するバイナリBLOBができました。実際には、とにかくコードをテストハーネスにロードする(つまり、コードをエスケープする)ために、この逆を行わなければならない可能性があります。
ツールを探しているなら、 x86 wikibook をお勧めします。基本的に、それはあなたが余裕のある1つ以上を選んで遊びをすることに帰着します。
シェルコードにデバッグ対策が含まれていない限り(スペースに制約があることを忘れないでください)、テストハーネスを備えたランタイムデバッガーがうまく機能する可能性があります。
生のバイナリシェルコードファイルでscdbgを使用して、使用するすべてのAPIのランタイムログを取得できます。実行はlibemuエミュレーション環境で行われます。 -dオプションは、メモリの変更(自己復号化)を検出すると、終了するとメモリのダンプを作成します。このツールは、シェルコードの開始オフセット(ROPプレフィックスの場合)の検索、および統合(基本)デバッグシェルもサポートしています。実際の動作を確認するためのYouTubeビデオがあります。
http://sandsprite.com/blogs/index.php?uid=7&pid=152
http://www.youtube.com/watch?v=jFkegwFasIw
ダンプされたメモリをIDA逆アセンブラに開いて、生の32ビットコードとして解釈することができます。また、ベースアドレスを設定し(通常は不要)、組み込みのスクリプト機能を使用する必要がある場合はコードを変更することもできます。