所以基本上每次我溢出缓冲区时,我都会看到:
Program received signal SIGABRT, Aborted.
0x00007ffff7a47c37 in __GI_raise (sig=sig@entry=6)
at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory
.
我遇到的问题是:0x00007ffff7a47c37
是什么?
它与RSP
和RBP
相距很远,并且在程序抛出分段错误之前,我可以这样做:
(gdb) break 12
(gdb) x/x $rip
0x400654 <main+94>: 0xe0558d48
似乎也不是RIP。
我的代码:
#include <stdio.h>
int main(int argc, char *argv[])
{
int dummy;
int* rip = &dummy;
printf("%p\n", rip);
int *ret;
char buf[20];
strcpy(buf, argv[1]);
ret = buf;
printf("%p:%s\n", ret, buf);
return 0;
}
我以run $(perl -e 'print "A"x40')
的身份运行脚本
答案 0 :(得分:0)
它是argv变量的内存地址。
答案 1 :(得分:0)
似乎也不是RIP。
尽管在您看来并非如此,但很可能是有些代码地址彼此相距很远。示例:
(gdb) bt
#0 0x0000000000000000 in ?? ()
#1 0x00007f2b9480dd52 in __libc_start_main () from /lib64/libc.so.6
#2 0x0000000000400479 in _start ()
值0x00007ffff7a47c37
绝对是发出信号的指令指针。您甚至可以使用gdb
命令disas __GI_raise
进行验证。