Нахождение обратного адреса стека - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть этот простой код:

#include <sys/types.h>
    #include <netinet/in.h>

    #include <stdio.h>
    #include <ctype.h>

    main(argc, argv)
        char *argv[];
    {
        char line[512];
        gets(line);

    }

Моя цель - найти расстояние между концом буфера и адресом возврата стека.

Так что, если мой буфер (строка) составляет 512 байт, я могу найти начальный адрес, добавить 512 и узнать, где будет начало этого расстояния ... но как мне найти адрес возврата стека?

По сути, я просто пытаюсь выяснить, как найти адрес возврата стека и начальный адрес буфера. Я не смог найти его при разборке main

1 Ответ

1 голос
/ 18 апреля 2019
#include <stdio.h>

int main()
{
    long l, k;

    asm("mov %%rsp,%0" : "=r"(l));
    asm("mov %%rbp,%0" : "=r"(k));
    printf("Stack pointer: 0x%16.16lX\n", l);
    printf("Stack frame base: 0x0%16.16lX\n", k);
    printf("Distance to return address: %ld\n", k-l);
}
snow ~ $ ./test
Stack pointer: 0x00007FFC95B793C0
Stack frame base: 0x000007FFC95B793D0
Distance to return address: 16

Очевидно, что это не переносимо, я предполагаю, x64 и gcc здесь.

Предостережение: BP не всегда будет указывать на обратный адрес. Иногда он не используется как указатель кадра стека, и некоторые функции могут не возвращать свои значения в стеке. Оптимизация регистра сломает его. Локальные переменные могут сломать его. Переменные выравнивания слов могут нарушить его. В принципе, не рассчитывайте, что это сработает. (Я полагаю, что в зависимости от параметров компилятора / времени компиляции вам также может понадобиться добавить к этому постоянное смещение.)

Мне действительно интересно, нет ли лучшего способа сделать то, что вы пытаетесь сделать ... =)

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