web-dev-qa-db-ja.com

シェルコード分析に焦点を当てたツールはありますか?

シェルコードは、分解に特定の課題を提示します。多くの場合、それは自己変更し、スタック(シェルコードが配置される可能性が高い場所)にジャンプし、標準の逆アセンブリツールが焦点を当てていない特定の異常なトリックに依存します。

これを念頭に置いて、シェルコードを分解および分析するために使用できるツールは何ですか?

4
Polynomial

libem 。無料。 Linuxの場合は、win32シェルコードを分析できます。
miasm 。 Pythonで実装されており、非常に興味深く見えます。

2
dgarcia

シェルコードは命令の生のブロックにすぎないため、これらのツールは実際には適していません。

ワット?実行可能ファイルも命令の生のブロックです。いえいえ。さて、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つ以上を選んで遊びをすることに帰着します。

シェルコードにデバッグ対策が含まれていない限り(スペースに制約があることを忘れないでください)、テストハーネスを備えたランタイムデバッガーがうまく機能する可能性があります。

3
user2213

生のバイナリシェルコードファイルで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ビットコードとして解釈することができます。また、ベースアドレスを設定し(通常は不要)、組み込みのスクリプト機能を使用する必要がある場合はコードを変更することもできます。

2
John