Что это за адрес, который вы видите в ошибке сегментации переполнения буфера? - PullRequest
0 голосов
/ 17 мая 2019

Таким образом, каждый раз, когда я переполняю буфер, я вижу это:

 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')

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

похоже, что это не 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 для проверки.

0 голосов
/ 17 мая 2019

Это адрес памяти переменной argv.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...