我正在完成一项任务,我需要使用GDB来理解已编译的C程序。我正在尝试按照说明操作但很难理解jmp
命令正在跳转到*
之前的地址时正在做什么。我看过地址所在的位置,但它介于两个单词之间。跳转后,有一个十六进制值的push
命令。我只假设这基本上就像使用指针一样,而push
命令会覆盖字节值,并将十六进制值压入其中。我不确定我有多远。这是我正在看的代码的一部分。由于它是编译的,我一直在使用x/10i $pc
命令(根据我的位置更改要显示的指令数量)来查看下一行指令。
=> 0x08048334 <+0>: jmp *0x8049798
0x0804833a <+6>: push $0x10
0x0804833f <+11>: jmp 0x8048304
第二个jmp
开始一系列类似的事件。这是jmp
指向的地址位置。这是我在编译的C文件的字节转储中看到此地址的唯一时间:
8049795: 83 04 08 3a addl $0x3a,(%eax,%ecx,1)
8049799: 83 04 08 4a addl $0x4a,(%eax,%ecx,1)
我很欣赏一些有用的见解,如果该值实际上被放入内存位置8049798
,如果是这样,它将它改变为什么?
我正在尝试按照说明操作,但很难准确理解jmp命令正在做什么
看来你正在看PLT跳跃存根。你可以找到详细的描述here(寻找“懒惰绑定优化”),但这是一个非常高级的主题,你可能不应该试图理解该代码(至少还没有)。
这条指令:
jmp *0x8049798
意思是:在0x8049798
位置读取值并跳转到那里。