1

IDS によるバッファ オーバーフローをテストするために、英数字形式の NOP 代替を探しています。0x90IDS は、HTTP RFC 標準を満たすために英数字以外の値をエンコードする%90ため、代わりに英数字の反復を試みる理由があります。英数字のペイロードが作成されましたが、エクスプロイト コードはバッファを埋めるためにmemsetandを使用します。0x90悪用コードはこちら.

このページは、いくつかのマルチバイト オプションを提供していますが、NOP バイト (147 行目あたり) をx0f\x1f\x00、上記のコードでペイロードにスレッドを提供するようなものまたはその他のものに置き換える方法がわかりません。推奨事項はありますか?

4

2 に答える 2

6

興味があれば、あらゆる種類の ASCII アセンブリ命令 (ASCII nops を含む) をリストしているすばらしいサイトがあります。これらの命令を使用すると、ASCII 文字のみで構成されるプログラム全体を作成できます。ブラック ハット作業のコンテキストでは、これらの手順は、侵入検知システムとテキスト フィルターを回避するのに非常に便利です。

たとえば、シーケンスABCDEFGIJKLMNOは基本的にアルファベット順のシーケンスのように見えますが、x86 no-op です。さらに、特定のレジスタを破棄することを気にしない場合は、これらのレジスタをインクリメントまたはデクリメントするだけの ASCII 命令のシーケンスを作成できます。

これらのマルチバイト nop を使用して nop-sled を構築しようとしている場合は、(AFAIK) を使用せずに真の nop-sled を作成することはできないことに注意してくださいnop。どのバイト オフセットでも入力でき、正確な no-op を実行できます. ただし、AI( inc ecx; dec ecx) のような命令のペアを使用することは、マルチバイト NOP シーケンスを使用するよりも安全です。これは、シーケンスが間違ったオフセットで入力された場合にレジスタを破棄するためです (一方、マルチバイト NOP は、不正な命令例外を引き起こしたり、予期しないことを行う可能性があります)。

とにかく、一般的に、Cのバッファ全体でマルチバイトシーケンスを複製する方法は次のとおりです(sizeof(buffer)opの長さの倍数である場合):

/* I find string notation to be more convenient, but it means using `sizeof(op)-1` to get the op length */
static char op[] = "\xaa\xbb\xcc";

char buffer[3072];
int i;

for(i=0; i<sizeof(buffer); i++)
    buffer[i] = op[i%(sizeof(op)-1)];
于 2012-10-14T06:29:56.223 に答える
1

マルチバイト NOP シーケンスが必要な場合 (およびそれがそのようなシーケンスであると想定0f 1f 00 )は、次のようなループで実行する必要があります。

char cycle[] = { '\x0f', '\x1f', '\x00' };
for (int i = 0; i < sizeof(buffer); i++)
    buffer[i] = cycle[i%3];

サイズが正確に 3 バイトの倍数ではないため、おそらく期待どおりに動作しbufferない可能性がありますが、その場合は最後に 1 バイトの NOP を使用できます。

int i = -1;
char cycle[] = { '\x0f', '\x1f', '\x00' };
while (++i < sizeof(buffer) - (sizeof(buffer) % 3))
    buffer[i] = cycle[i%3];
while (i < sizeof(buffer))
    buffer[i++] = '\x90';

memsetその機能はすべてのバイトを特定の値に設定することで機能するため、これを行うことはできません。交互のバイトを異なる値に設定することはできません。

于 2012-10-14T05:50:22.637 に答える