【问题标题】:How to set breakpoint using GDB for x86 assembly when no symbol information is present? [duplicate]没有符号信息时,如何使用 GDB 为 x86 程序集设置断点? [复制]
【发布时间】:2016-12-24 02:37:07
【问题描述】:

在没有符号信息的情况下,如何使用 GDB for x86 汇编代码设置断点,即无法写入b *_start

我想立即停止执行,但是写b *0 不是很有用,因为这会在地址0 处停止执行,但我需要在地址x 相对于起点中断执行(不存在符号信息时未知)。

【问题讨论】:

  • 可执行文件是否可读?然后你可以使用例如获取它的入口点。 objdump -f.
  • 实际上,我正在尝试调试一个通过修改更改其入口点的可执行文件,以便执行从无标签开始。
  • 您说:“通过修改更改其入口点的可执行文件”。那么这个程序确实有一个已知的入口点吗?如果不是,如何执行?
  • 好吧,在这种情况下,Microsoft PE EXE 的可执行文件在其标头中更改了其入口点字段,因此执行从一个特定但相当随意的地址开始,没有任何标签支持。跨度>
  • @NicolasLykkeIversen:对,所以使用一个工具,它会从文件元数据中显示入口点的数字地址,并使用b *0x...(复制/粘贴地址,所以你在入口点)。这就是马克告诉你如何处理objdump

标签: debugging x86 gdb nasm gnu


【解决方案1】:

使用objdump -f 之类的东西来显示入口点地址的数值。或inside gdb, info files will show you the entry point.

将该值复制/粘贴到 gdb 命令中:b *0x... 以在入口点中断。然后,您可以从那里单步执行。


另请参阅 标签 wiki 的底部,了解一些 asm 调试技巧,例如 layout reg


objdump -f 的示例输出:

/bin/ls:     file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x0000000000404870          <<---- copy this address

而不是寻找入口点地址

b *0 在 gdb 尝试设置断点时会导致错误。这导致在任何指令执行之前在入口点停止。删除虚假断点(否则当您尝试单步执行或继续时它会一直出错)。 Stopping at the first machine code instruction in GDB

【讨论】:

  • 太好了,谢谢。
  • 后来意识到这是重复的,同时正在寻找有关 b *0 hack 的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 2015-10-05
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 2011-12-22
相关资源
最近更新 更多