所以我使用十六进制编辑器和gdb对二进制文件进行逆向工程,可执行文件没有调试信息供我使用。如何在二进制运行中的给定偏移处设置观察点?
例如:
在可执行文件中有一个偏移量为0x85c6d的字节,我想在那里设置一个观察点。我将如何在gdb中执行此操作?有可能吗?
我已经尝试watch 0x85c6d
和watch *0x85c6d
,但第一个根本没有工作,第二个设置了ram而不是实际文件的偏移量。我通过docs查看了观察点无济于事。非常感谢任何帮助。
答案 0 :(得分:1)
有可能吗?
是:您需要弄清楚在内存中该地址的最终位置,并在该内存位置设置一个观察点。
如果这是ELF二进制文件,readelf -l a.out
将告诉您文件的哪些部分加载到哪个地址(您关心LOAD
段)。
例如:
readelf -Wl a.out | grep LOAD
LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x000638 0x000638 R E 0x200000
LOAD 0x000e48 0x0000000000600e48 0x0000000000600e48 0x0001e0 0x0001e8 RW 0x200000
这告诉您文件中从偏移量0开始的可执行代码将加载到地址0x400000
的内存中,而来自偏移0xe48
的数据将加载到0x600e48
的内存中。
PIE二进制文件有点复杂:你需要添加初始加载地址,这可以从执行变为执行。好消息:GDB默认禁用随机化,因此当程序在GDB下运行时,初始加载地址不会因运行而异。
您可以使用(gdb) info proc map
命令找到初始加载地址。