興味があれば、あらゆる種類の 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)];