【问题标题】:How to analyze the indirect jump in assembly code如何分析汇编代码中的间接跳转
【发布时间】:2019-04-18 23:53:43
【问题描述】:

我是 C 和汇编代码的初学者,目前正在从事汇编项目。但是,我遇到了间接跳转指令的一些问题。

jmp指令行是:

4006a6: ff 24 c5 50 08 40 00    jmpq   *0x400850(,%rax,8)

当我转到 400850 时,该行是:

400850: ad                      lods   %ds:(%rsi),%eax
400851: 06                      (bad)  
400852: 40 00 00                add    %al,(%rax)
400855: 00 00                   add    %al,(%rax)
400857: 00 b3 06 40 00 00       add    %dh,0x4006(%rbx)
40085d: 00 00                   add    %al,(%rax)
40085f: 00 bc 06 40 00 00 00    add    %bh,0x40(%rsi,%rax,1)

根据我了解到的情况,我应该查看存储在 400850 + 8 * rax 中的地址,然后跳转到该地址查看指令并进行具体操作。比如rax = 1,我应该查看400858中存储的地址,但是我找不到400858,我也不知道“ab”之类的值是什么意思,是地址吗?

顺便说一句,我相信这个间接跳转代表了C代码中的一个切换条件。

【问题讨论】:

  • 从 400857 开始并跳过第一个字节:b3 06 40 00,即 004006b3 作为 32 位 little-endian(最低有效在前)字。在查看数据而非代码时,查看十六进制转储通常比反汇编更容易。
  • @zx485:这不是代码,而是数据(指针)。你也不想从0x400858拆解。
  • 0x400850 包含数据,而不是代码。指向代码的指针,每个 8 个字节。 switch/case 语句通常以这种方式编译,表中的每个指针都指向 case 语句。

标签: assembly x86-64 reverse-engineering att objdump


【解决方案1】:

这个地址 0x400850 是一个指针表,所以它是这样的: 400850: 00000000004006ad 400858: 00000000004006b3 400860: 00000000004006bc

rax 是指针表的索引。您需要知道索引并从表中找到跳转地址。

【讨论】:

    【解决方案2】:

    jmpq *0x400850(,%rax,8) 是一个间接的jmp 索引到跳转目标表。是的,它可能是编译器从switch 语句生成的。


    您使用了objdump -D 而不是objdump -s,因此输出根据x86-64 指令的无意义解码将hexdump 分解为块,而不是qword 地址。

    格式是

    starting   machine code            disassembly
    address    hex byte(s)             (AT&T syntax)
    
    400850:    ad                      lods   %ds:(%rsi),%eax
    

    一行中的字节与指令一起使用。 lods是单字节指令,操作码为0xad,所以0x400850处qword的低字节为0xad

    hexdump 就在那里,但不是每个 8 字节块都有编号标签。每个字节都有自己的地址;您只需要从前面标记的地址开始计数即可找到所需数据块的开头。


    或者按照assembly jmp to a line that doesn't exist 中的建议使用objdump -s 来获取每个ELF 部分的简单十六进制转储,分成统一大小的块。

    或者从 GDB 内部,一个x 命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 2014-11-16
      • 2015-03-03
      • 1970-01-01
      • 2023-03-17
      • 2010-11-14
      • 2015-12-15
      相关资源
      最近更新 更多