聘我网

新概念招聘3.0

如何分解机器码

vote up0vote downstar
40087e:       48 8b 05 cb 01 20 00    mov    0x2001cb(%rip),%rax       

以上是来自objdump的输出。

我想知道的是,

48 8b 05 cb 01 20 00中的哪些字节分别代表mov0x2001cb(%rip)等等更进一步的信息。

该如何才能更细粒度地分析机器码?

 

1 个答复

vote up0vote downcheck

48REX prefix,表示操作数是64

例如,是RAX而非EAX

8bmov指令的opcode。每个指令都有它的opcode,比如2b表示sub,8d表示lea

05Mod位与R/M位进行位或的结果,

表示内存取值是RIP+disp32而不只是disp32

Reg位还指定了用RAX作为另一个操作数

cb, 01, 20 and 00即指令的disp32地址,其值为2001CBH说明是小端序.

综上,这个机器码表示mov 0x2001cb(%rip),%rax

或者用Intel语法: MOV RAX, [RIP+2001CBH]

最后讲下学习的方法,

一是可以查看Intel或者AMDCPU文档系统学习

也可以结合echoobjdump获得一些感性认识:

[abc-greenhand@dev-test test]$ echo -ne "\x48\x8b\x05\xcb\x01\x20\x00">f.bin
[abc-greenhand@dev-test test]$ objdump -D -b binary -m i386:x86-64 f.bin

f.bin:     file format binary

Disassembly of section .data:

0000000000000000 <.data>:
   0:   48 8b 05 cb 01 20 00    mov    0x2001cb(%rip),%rax        # 0x2001d2

试着去掉某个字节,看汇编的结果如何变化~

链接

您的回答





不是您要找的问题? 浏览其他含有标签 的问题或者 自己问个.