我在Kali Linux Rolling 2019.2。上使用GNU gdb(GDB)8.3。我有以下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 ()
为什么会发生这种情况,以及如何使内存地址中断工作?
答案 0 :(得分:2)
正如评论中指出的那样,您在第一种情况下使用的地址不正确,可能是由于类似PIE的原因(GDB通常会禁用ASLR)。这意味着您试图在一个无效地址处放置一个断点,这将触发最近修复的GDB错误:
https://sourceware.org/ml/gdb-patches/2019-05/msg00361.html
一旦看到GDB这样停止:
[1]+ Stopped gdb soQuestionProgram
您应该放回外壳。只需使用fg
命令恢复GDB,然后继续进行调试会话。一旦GDB 8.4发布,此错误将得到修复。
使用GDB start
或starti
命令运行程序,但分别停在main
的顶部或用户空间中的第一条指令之前。程序运行后,GDB的反汇编中将包含实际地址,而不仅仅是相对于文件开头的相对偏移量。
或使用gcc -fno-pie -no-pie
编译+链接以构建非PIE可执行文件,并在链接时选择固定的加载地址。