如何处理objdump产生的这个“lea”指令?

逆向工程 拆卸 部件 转储
2021-06-17 06:35:06

所以基本上我是objdump用来在 32 位 Linux x86 上从“GNU Coreutils”反汇编二进制文件的。

在反汇编的代码中,我发现了一条这样的“损坏”指令:

 804bb49:   8d 04 ed 00 00 00 00    lea    0x0(,%ebp,8),%eax

在这里问了一个关于一个非常相似的指令的相关问题,在那个问题中,我认为它应该是一个与跳转表相关的指令,但是这个呢?我很困惑..

谁能给我一些帮助?

2个回答

我不知道是什么让你认为这条指令是“坏的”——括号后面有一个逗号,中间没有参数?在这种情况下,反汇编器只是不显示参数,因为它是“零”(更准确地说,它指定“无寄存器”,其中允许“任何处理器寄存器”)。

这里发生的事情是:当寻址内存位置时,处理器有一个模式,它寻址

  • 基础偏移
  • 加上一个处理器寄存器的内容
  • 加上另一个处理器寄存器的内容,乘以一个可以是 1、2、4 或 8 的整数

这个计算非常快,因为它是在地址总线子系统中的特殊硬件中完成的。

lea(加载有效地址)指令是一种特殊的RAM存取-它计算操作数的地址,但随后,它移动的地址,而不是在该地址的数据,到目的寄存器。

因此,您的“损坏”指令将基址偏移量 0 加上“no”第一个寄存器,加上 ebp 内容的 8 倍,移入 eax。通过将 ebp 移动到 eax 并乘以 8 或移动并向左移动 3 位,也可以完成相同的lea操作,但指令可能要快一点(因为,正如我所说,它是在专门的地址总线硬件中完成的),所以编译器使用那个来节省几个周期。这里什么都没有坏。

您可能想在反汇编时查看 i386 汇编程序参考,间接寻址在OS X 汇编程序参考中有很好的解释,向下滚动到“间接内存操作数”。

破了是什么意思

这篇文章或您之前的文章中的说明似乎没有被破坏

如果您对 AT&T 语法感到困惑,那么您可以要求 objdump 以 intel 语法进行反汇编

更好的破解解释可以得到更好的答案

root@box:/home/dsl/gcctests/test# cat testjt.c 
void naked (void)
{
        asm( ".globl _naked\n");
        asm( "_naked:\n");
        asm( "jmp *0x80509e4(,%eax,4)");
        asm( "lea 0x0(,%ebp,8),%eax");
        asm( "ret");
}
int main (void)
{
        naked();
        return 0;
}


root@box:/home/dsl/gcctests/test# objdump -t ./testjt | grep _naked
08048357 g       .text  00000000              _naked


root@box:/home/dsl/gcctests/test# objdump -d --disassembler-option=intel  ./testjt | grep -A 2 _naked


08048357 <_naked>:
 8048357:       ff 24 85 e4 09 05 08    jmp    DWORD PTR [eax*4+134547940]
 804835e:       8d 04 ed 00 00 00 00    lea    eax,[ebp*8]


root@box:/home/dsl/gcctests/test#