Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我的缓冲区存储在堆栈中的两个位置?_C - Fatal编程技术网

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 did
argv[1]='\0'之后是正确的;printf(“%s\n\n\n\n%s\n”,buf,argv[1])。对于
argv[1]
,输出是
aaaaaa…
(null)
,但堆栈看起来仍然相同。如果您想确认,可以试试。@amiTheregroot,这是预期的,因为您将
argv[1]
更改为指向null,而不是其内容。更改argv[1][0]
而不是它所允许的。我也这样做了,同样的结果。