Linux 如何强制gdb将plt地址解析为反汇编输出中的名称?
我得到了一份工作。在使用gdb加载和启动它之后,我发现在Linux 如何强制gdb将plt地址解析为反汇编输出中的名称?,linux,assembly,gdb,elf,Linux,Assembly,Gdb,Elf,我得到了一份工作。在使用gdb加载和启动它之后,我发现在disass输出中call指令总是显示plt地址而不是plt名称。在以下示例中,显示的是地址0x8048430,而不是其函数名printf() 具有以下输出: [DEBUG] got:setbuf=0x8049fdc [DEBUG] got:strcmp=0x8049fe0 [DEBUG] got:printf=0x8049fe4 <===================== [DEBUG]获得:setbuf=0x8049fdc
disass
输出中call
指令总是显示plt地址而不是plt名称。在以下示例中,显示的是地址0x8048430
,而不是其函数名printf()
具有以下输出:
[DEBUG] got:setbuf=0x8049fdc
[DEBUG] got:strcmp=0x8049fe0
[DEBUG] got:printf=0x8049fe4 <=====================
[DEBUG]获得:setbuf=0x8049fdc
[调试]获取:strcmp=0x8049fe0
[DEBUG]get:printf=0x8049fe4二进制文件是否有调试符号,因此objdump-drwC-Mintel
将其解析为printf@plt
?(如果你喜欢AT&T语法,也可以省略-Mintel
。@PeterCordes这很奇怪objdump-drwC-Mintel
输出调用8048430
而不是printf@plt
好的,所以我认为pwntools必须为您做更多的反向工程,也许可以追踪PLT并找到它使用的条目。GDB没有这样做。目标符号名称必须存在,以便进行动态链接,但PLT条目本身只是代码,不需要这些标签上的符号。GDB是为调试您使用调试信息编译的代码而设计的(并且工作得很好),而不是为反向工程而设计的。@PeterCordes谢谢。我发现IDA免费软件在反编译二进制文件方面有很好的功能,我将使用它。你的二进制文件是否有调试符号,所以objdump-drwC-Mintel
将其解析为printf@plt
?(如果你喜欢AT&T语法,也可以省略-Mintel
。@PeterCordes这很奇怪objdump-drwC-Mintel
输出调用8048430
而不是printf@plt
好的,所以我认为pwntools必须为您做更多的反向工程,也许可以追踪PLT并找到它使用的条目。GDB没有这样做。目标符号名称必须存在,以便进行动态链接,但PLT条目本身只是代码,不需要这些标签上的符号。GDB是为调试您使用调试信息编译的代码而设计的(并且工作得很好),而不是为反向工程而设计的。@PeterCordes谢谢。我发现IDA免费软件在反编译二进制文件方面有很好的功能,我打算改用它。
[DEBUG] got:setbuf=0x8049fdc
[DEBUG] got:strcmp=0x8049fe0
[DEBUG] got:printf=0x8049fe4 <=====================