我可以强制 GDB 断点并反汇编吗?

逆向工程 调试 C++ 数据库 断点 调试符号
2021-06-14 10:22:44

抱歉英语不是我的第一语言。

在 GDB 中设置断点时我注意到了一些事情。如果未加载符号,它们似乎会被忽略。

我发现当完全没有加载任何符号时 GDB 的行为很奇怪,如果我想调试某些东西,我必须在__libc_start_main@pltnexti上设置断点,直到我到达主二进制文件。我还注意到我也无法在主二进制文件中反汇编(我收到这条奇怪的消息“没有函数包含所选帧的程序计数器。 ”),但除此之外,断点基本上被忽略了。我找到了一个奇怪的解决方法,那就是设置

set *0x56555878 = 0xcc 

我的问题是:

  • 为什么 GDB 在没有符号的情况下表现得如此奇怪?
  • 为什么 normal for 断点无法识别?
  • 将我想要的断点设置为 0xcc 然后休息;这是一个好习惯吗?
  • 有没有更好的方法来设置断点?
  • 为什么没有符号就不能拆卸 为什么没有符号就不能拆卸?

编辑:看起来我不能在 glibc 中设置 *breakpoints 但是当我进入 int main() 程序时我可以,但是在 int main() 中,我失去了反汇编的能力。

1个回答

gdb 主要是一个源码级调试器

在地址上设置 bp 而不是符号使用 *

(gdb) break main
Breakpoint 1 at 0x100401094: file mingtest.cpp, line 4.
(gdb) break *0x100401094
Note: breakpoint 1 also set at pc 0x100401094.
Breakpoint 2 at 0x100401094: file mingtest.cpp, line 4.
(gdb)

您可以在任意地址使用地址、长度进行反汇编

(gdb) disassemble 0x100401094,+0x10
Dump of assembler code from 0x100401094 to 0x1004010a4:
   0x0000000100401094 <main(int, char**)+20>:   mov    edx,DWORD PTR [rbp+0x10]
   0x0000000100401097 <main(int, char**)+23>:   lea    rcx,[rip+0x1f62]        # 0x100403000
   0x000000010040109e <main(int, char**)+30>:   call   0x100401110 <printf>
   0x00000001004010a3 <main(int, char**)+35>:   mov    DWORD PTR [rbp-0x4],0x0
End of assembler dump.
(gdb)