【发布时间】: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