GDB останавливает программу, когда я ломаю по адресу, пока он работает со смещением - PullRequest
0 голосов
/ 11 июля 2019

Я использую GNU GDB (GDB) 8,3 на Kali Linux Rolling 2019.2. У меня есть следующий код C

#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) {
    int x = 5;
    int y = 3;
}

И сборка

Dump of assembler code for function main:
   0x0000000000001125 <+0>:     push   rbp
   0x0000000000001126 <+1>:     mov    rbp,rsp
   0x0000000000001129 <+4>:     mov    DWORD PTR [rbp-0x14],edi
   0x000000000000112c <+7>:     mov    QWORD PTR [rbp-0x20],rsi
   0x0000000000001130 <+11>:    mov    DWORD PTR [rbp-0x4],0x5
   0x0000000000001137 <+18>:    mov    DWORD PTR [rbp-0x8],0x3
   0x000000000000113e <+25>:    mov    eax,0x0
   0x0000000000001143 <+30>:    pop    rbp
   0x0000000000001144 <+31>:    ret    
End of assembler dump.

Когда я ломаюсь по адресу памяти, программа останавливается.

(gdb) break *0x0000000000001130
Breakpoint 1 at 0x1130
(gdb) r
Starting program: /root/Documents/soQuestionProgram 

[1]+  Stopped                 gdb soQuestionProgram

Однако, когда я прерываюсь по тому же адресу памяти, используя смещение main, точка останова работает.

(gdb) break *main+11
Breakpoint 1 at 0x1130
(gdb) r
Starting program: /root/Documents/soQuestionProgram 

Breakpoint 1, 0x0000555555555130 in main ()

Почему это происходит, и как я могу заставить взлом по адресу памяти работать?

1 Ответ

2 голосов
/ 11 июля 2019

Как отмечалось в комментариях, адрес, который вы используете в первом случае, неверен, возможно, из-за чего-то вроде PIE (GDB обычно отключает ASLR, если может). Это означает, что вы пытаетесь разместить точку останова по недопустимому адресу, который вызывает ошибку GDB, которая была недавно исправлена:

https://sourceware.org/ml/gdb-patches/2019-05/msg00361.html

Как только вы увидите, что GDB остановился следующим образом:

  [1]+  Stopped                 gdb soQuestionProgram

вы должны быть отброшены обратно в снаряд. Просто возобновите GDB с помощью команды fg и продолжите сеанс отладки. После выхода GDB 8.4 эта ошибка будет исправлена.


Используйте команду GDB start или starti для запуска программы, но остановитесь на вершине main или перед первой инструкцией в пользовательском пространстве, соответственно. После запуска программы GDB будет иметь реальные адреса при разборке, а не только относительные смещения относительно начала файла.

Или скомпилируйте + ссылку с помощью gcc -fno-pie -no-pie, чтобы создать исполняемый файл без PIE с фиксированным адресом загрузки, выбранным во время ссылки.

...