1

寻找字母数字形式的 NOP 替代方案,以便通过 IDS 测试缓冲区溢出。IDS 将对非字母数字值进行编码0x90%90满足 HTTP RFC 标准,因此有理由改为尝试字母数字迭代。已创建一个字母数字有效负载,但漏洞利用代码使用memset0x90填充缓冲区。在这里利用代码。

此处的页面提供了一些多字节选项,但我不确定如何将 NOP 字节(第 147 行附近)替换为类似x0f\x1f\x00或其他任何可能为上述代码中的有效负载提供 sled 的内容。有什么建议吗?

4

2 回答 2

6

这是一个很棒的网站,列出了各种 ASCII 汇编指令(包括 ASCII nops),如果你好奇的话。使用这些指令,您可以构建仅包含 ASCII 字符的整个程序。在黑帽工作的背景下,这些说明对于绕过入侵检测系统和文本过滤器非常方便。

例如,该序列ABCDEFGIJKLMNO是一个 x86 无操作,尽管基本上看起来像一个字母序列。此外,如果您不关心丢弃某些寄存器,您可以创建 ASCII 指令序列,这些指令只会增加或减少这些寄存器。

如果您尝试使用这些多字节 nop 构建 nop-sled,请注意(AFAIK)如果不使用nop可以在任何字节偏移处输入并仍然执行精确的 no-op,则无法制作真正的 nop-sled . AI但是,使用像( )这样的一对指令inc ecx; dec ecx比使用多字节 NOP 序列更安全,因为如果在错误的偏移量处输入该序列只会破坏寄存器(而多字节 NOP 可能会导致非法指令异常或执行意外操作)。

无论如何,一般来说,您可以通过以下方式在 C 中的缓冲区中复制任何多字节序列(前提sizeof(buffer)是操作长度的倍数):

/* 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];

这可能不会像您期望的那样做,因为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';

您不能使用 a 来执行此操作,memset因为该函数通过将每个字节设置为特定值来工作,它不允许您将交替字节设置为不同的值。

于 2012-10-14T05:50:22.637 回答