您在缓冲区溢出分段错误中看到的地址是什么?

时间:2019-05-16 21:05:08

标签: c

所以基本上每次我溢出缓冲区时,我都会看到:

 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是什么?

它与RSPRBP相距很远,并且在程序抛出分段错误之前,我可以这样做:

(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')的身份运行脚本

2 个答案:

答案 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进行验证。