• 抬起头,继续前进吧,去把这个不完美的故事,变成你成所期望的样子
  • 登山路上我们会放弃很多东西,但这些被我们丢掉在我们登上山顶之际,都会一一回来
  • 不论开发还是逆向,数学水平的高低直接决定了”你的饭碗里有没有肉”
  • 万丈高楼平地起,勿在浮沙筑高台

Intel x86硬编码结构基础学习与手动分析

汇编 菜鸟 9个月前 (11-03) 6856次浏览 已收录 2个评论
[隐藏]

         基础扎实比什么花式技术都重要,而硬编码也是逆向工程中很重要的一部分,它可以教会我们汇编指令与二进制数字间是何种映射关系,我们需要稳扎稳打来学习。

一、总体结构

图 1 是 Intel 在官方文档第二卷中给出的,描述了指令的结构(32 位):

Intel x86 硬编码结构基础学习与手动分析

Intel x86 硬编码结构基础学习与手动分析——硬编码总体结构

下面我们先来一步步认识其结构和作用,然后如果使用我们在手动分析那一节来慢慢体会。

1、Instruction Prefixes

这部分被称作前缀指令,同时我们从图 1 中可以看到它是可选的。
由于它的个数是有限的,所以 CPU 根据内容就可轻易分辨某个字节是否是前缀指令还是 opcode.
前缀指令有 4 组,但在使用时只能出现一个隶属于某个分组的指令。
前缀指令最多可以有 4 个(即这 4 个分别是 4 组中每组中的一个),最少是 0 个,而且和顺序无关。
下面就直接列出来,其中”操作数宽度前缀指令”和”地址宽度前缀指令”明确指示当前指令的地址寻址方式,而不采用 CPU 的默认模式。

含义二进制
LOCK 和 REPEAT 前缀指令LOCK0xF0
REPNE/REPNZ0xF2
REP/PEPZ0xF3
段前缀指令CS0x2E
SS0x36
DS0x3E
ES0x26
FS0x64
GS0x65
操作数宽度前缀指令如果默认是 16 位则切换到 32 位,如果是 32 位则切换到 16 位0x66
地址宽度前缀指令如果默认是 16 位则切换到 32 位,如果是 32 位则切换到 16 位0x67

2、Opcode

该部分是一条指令的核心,通过 Intel 的 Table 2-A,我们可以发现按照 Intel 的描述,指令也分定长和变长,即有时仅用一个字节的 opcode 就可以描述一条指令,
而变长有时就需要 ModR/M 或 SIB,以及辅助位。
例如 0x50-0x57 在 Table 2-A 中的描述是:
Intel x86 硬编码结构基础学习与手动分析

3、ModR/M

当指令中出现内存操作对象时,需要在操作码后面附加一个字节来进行补充说明,这个字节就是 ModR/M
ModR/M 结构如下:
Intel x86 硬编码结构基础学习与手动分析

4、SIB

ModR/M 字段是用来内存寻址的,但是,当地址形式如 DS:[EAX + ECX*2 + xxx]时,
仅仅靠 ModR/M 字段是无法描述的,需要再加一个 SIB 字节来共同描述。
SIB 结构如下:
Intel x86 硬编码结构基础学习与手动分析

5、Displacement 和 Immediate Data

Displacement 主要描述了寻址中,地址的偏移部分。
Immediate Data 如字面意思,立即数,直接操作的数字,如 1,2,0x64 等。

二、手动分析

现在让我们直接开始来手动分析一条硬编码,来还原它的汇编指令。
目标:80 4C 27 FF 18

1、分析前缀

没有发现特定的字节,所以无前缀指令。

2、根据 opcode 确定指令框架

查询 Opcode 的 Table A-2 One-byte Opcode Map: (00H — F7H) *
找到 0x80-0x83,先确定操作数为 Ev, Ib
Intel x86 硬编码结构基础学习与手动分析
v:Word,dword 或 qwrod(64 位),依赖于操作的宽度。
I:立即数。
b:字节
E:在 opcode 后跟随着的 ModR/M 字节来指明操作数,可以是通用寄存器也可以是内存地址。
1A:ModR/M 的 3、4、5 字节用作 opcode 的扩展。

3、分析 ModR/M

由于 E 标识,我们可以确定 0x4C 为 ModR/M,对其按格式拆分:
0x4C = 01 001 100
Mod : 01
Reg/opcode:001
R/M:100
由于出现了 1A 标识,先查询 Table A-6 Opcode Extensions for One- and Two-byte Opcodes by Group Number *
Intel x86 硬编码结构基础学习与手动分析
确定 Opcode 为 OR。
再查询 ModR/M 的 Table 2-2 32-Bit Addressing Forms with the ModR/M Byte:
Intel x86 硬编码结构基础学习与手动分析
Ev 为[–][–]+disp8,还有部分缺少。在 Table 2-2 下面提示我们[–][–]含义是在 ModR/M 后面还跟着 SIB 字节。
所以可以确定 0x27 为 SIB 字节,disp8 表示一个 word,所以 FF(-1)就是 disp8,也就是 Displacement。也可以确定了 0x18 就是立即数。

4、分析 SIB

查询 SIB 的 Tab 2-3 32-Bit Addressing Forms with the SIB Byte
Intel x86 硬编码结构基础学习与手动分析
Intel x86 硬编码结构基础学习与手动分析

最终确定得到[–][–]就是 edi。

5、验证结果

现在已经将所有元素凑齐,最后还原的汇编指令就是:or byte ptr [edi – 1], 18
我们打开 OD 验证一下:
Intel x86 硬编码结构基础学习与手动分析

三、小结

先从概念上来了解硬编码的结构,然后只有真正动手才能对所学概念获得更深刻的理解。如有疑问,欢迎各位在评论区提出~大家互相交流。


学习心得 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Intel x86 硬编码结构基础学习与手动分析
喜欢 (1)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 想问下师兄,Eb,lb,disp之类的解释可以在哪查到呢?
    CR31_xys2019-05-27 13:38 回复
    • 菜鸟
      在Intel的官方文档里,Eb lb之类的描述在卷2 附录A.2部分,disp8 disp32这个就是在表Table 2-2下面会有单独说明的。 (Table2-2是在卷2的第2章 2.1.3部分)
      菜鸟2019-05-29 13:27 回复