C 为什么我的缓冲区存储在堆栈中的两个位置?
代码:C 为什么我的缓冲区存储在堆栈中的两个位置?,c,C,代码: #include <stdio.h> int main(int argc, char *argv[]){ char buf[512]; strcpy(buf, argv[1]); return 0; } gcc -g -z execstack buf.c -o buf -fno-stack-protector 问题: #include <stdio.h> int main(int argc, char *argv[]
#include <stdio.h>
int main(int argc, char *argv[]){
char buf[512];
strcpy(buf, argv[1]);
return 0;
}
gcc -g -z execstack buf.c -o buf -fno-stack-protector
问题:
#include <stdio.h>
int main(int argc, char *argv[]){
char buf[512];
strcpy(buf, argv[1]);
return 0;
}
gcc -g -z execstack buf.c -o buf -fno-stack-protector
所以基本上使用gdb
我在返回0的行上设置了一个断点代码>并按如下方式运行脚本:run$(python-c'print“A”*600')
,然后当我执行x/600x$rsp
时,我从以下位置获得缓冲区开始:
0x7fffffffdcf0: 0xffffdfe8 0x00007fff 0xf7fd3298 0x00000002
0x7fffffffdd00: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdd10: 0x41414141 0x41414141 0x41414141 0x41414141
// it goes on... until
0x7fffffffdf50: 0x41414141 0x41414141 0x00000000 0x00000000
但当我进一步往下看时,我还看到:
0x7fffffffe2f0: 0x776f6c66 0x6675622f 0x41414100 0x41414141
0x7fffffffe300: 0x41414141 0x41414141 0x41414141 0x41414141
// It goes until
0x7fffffffe540: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffe550: 0x48530041 0x3d4c4c45 0x6e69622f 0x7361622f
同样对于缓冲区溢出攻击,如果我使用第一个位置,则攻击无效,但如果我使用第二个位置,则攻击有效
那么,我可以知道为什么我的缓冲区存储在两个不同的位置吗?您的缓冲区不存储在两个位置。您只是在自己的代码中复制数据。有一个输入被提供给main
,然后是你的缓冲区,你在那里复制输入。这是它的两个副本,但只有一个是你的缓冲区
使用gdb显示存储argv[1]
的位置也将显示以下内容:
p argv[1]
$1 = 0x7ffffffee2ce 'A' <repeats 600 times>
p argv[1]
$1=0x7FFFFFFE2CE“A”
当然,地址在不同的系统上是不同的。你的意思是第一个是
argv[1]
,第二个是我的buf
?@amiTheregroot是的,在strcpy()
I didargv[1]='\0'之后是正确的;printf(“%s\n\n\n\n%s\n”,buf,argv[1])代码>。对于argv[1]
,输出是aaaaaa…
和(null)
,但堆栈看起来仍然相同。如果您想确认,可以试试。@amiTheregroot,这是预期的,因为您将argv[1]
更改为指向null,而不是其内容。更改argv[1][0]
而不是它所允许的。我也这样做了,同样的结果。