逆向初级-硬编码(六)

6.1.前缀指令

1、硬编码的结构
逆向初级-硬编码(六)
2、前缀指令是分组的

<1> LOCK和REPEAT前缀指令:
	LOCK			FO
	REPNE/REPNZ 	F2
	REP/REPZ		F3
<2> 段前缀指令:
	CS(2E)
	SS(36)
    DS(3E)
    ES(26)
    FS(64)
    GS(65)   
<3>操作数宽度前缀指令
	66
<4>地址宽度前缀指令。
	67

6.2.经典定长指令_修改ERX

逆向初级-硬编码(六)
不包含Eb,Gb,说明是定长指令;

包含Eb,Gb,说明是变长指令

1、PUST/POP
逆向初级-硬编码(六)
DTDebug中安Ctrl+E快捷键测试
逆向初级-硬编码(六)
2、INC/DEC

0x40 - 0x47    INC ERX     加1
0X48 - 0X4F    DEC ERX	   减1

测试
逆向初级-硬编码(六)
3、MOV Rb,Ib

0xb0 - 0xb7      MOV Rv,Ib     //后面跟1个字节的立即数

4、MOV ERX,Id

0xb8 - 0xbF	      MOV ERX,Id    //后面跟4个字节的立即数

逆向初级-硬编码(六)
5、XCHG EAD,ERX

0x90 - 0x97 XCHG EAX,ERX

逆向初级-硬编码(六)

6.3.经典定长指令_修改EIP

1、0x70 - 0x7F
逆向初级-硬编码(六)
2、0x0F 0x80 - 0x0F 0x8F
逆向初级-硬编码(六)
逆向初级-硬编码(六)
3、其它指令
逆向初级-硬编码(六)
逆向初级-硬编码(六)

4、其它指令
逆向初级-硬编码(六)

6.4.经典变长指令_ModRM

1、经典变长指令_ModR/M

0x88	MOV Eb,Gb		G:通用寄存器
0x89	MOV EV,GV		E:寄存器/内存
0x8A	MOV GB,Eb		b:字节
0X8B	MOV Gv,EV		v:Worder,duubleword or quadword

当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M,该字节的8个位被分成了三部分
逆向初级-硬编码(六)
Mod(第6,7位)和R/M(第0,1,2位)共同描述指令中的E部分,即寄存器/内存
逆向初级-硬编码(六)
2、当Mod = 00时,ModR/M字节通过寄存器直接进行内存寻址

例如当操作指令为88 01时,其对应的汇编为MOV BYTE PTR DS:[ECX], AL

88 是操作指令,其后跟随的01为ModR/M
逆向初级-硬编码(六)
0x88描述了操作数宽度为b(byte),且操作数的顺序为Eb Gb,所以这条汇编指令为MOV BYTE PTR DS:[ECX], AL

同理可以分析出如下操作指令对应的汇编指令
逆向初级-硬编码(六)
3、当Mod = 01时,ModR/M字节通过寄存器+I8进行内存寻址(I为立即数,即8位立即数)

例如当操作指令为88 41 12时,其对应的汇编为MOV BYTE PTR DS:[ECX+12],AL

88 是操作指令,其后跟随的41为ModR/M
逆向初级-硬编码(六)
所以这条汇编指令为MOV BYTE PTR DS:[ECX+12],AL

同理可以分析出如下操作指令对应的汇编指令
逆向初级-硬编码(六)
4、当Mod = 10时,ModR/M字节通过寄存器+I32进行内存寻址

例如当操作指令为88 81 12 34 56 78时,其对应的汇编为MOV BYTE PTR DS:[ECX+78563412],AL

88 是操作指令,其后跟随的81为ModR/M
逆向初级-硬编码(六)
所以这条汇编指令为MOV BYTE PTR DS:[ECX+78563412],AL
同理可以分析出如下操作指令对应的汇编指令

逆向初级-硬编码(六)
5、当Mod = 11时,ModR/M字节直接操作两个寄存器

例如当操作指令为88 C1时,其对应的汇编为MOV CL,AL

88 是操作指令,其后跟随的C1为ModR/M
逆向初级-硬编码(六)
所以这条汇编指令为MOV CL,AL

同理可以分析出如下操作指令对应的汇编指令
逆向初级-硬编码(六)

6.5.经典变长指令_Reg/Opcode

逆向初级-硬编码(六)
上一节中,3-5位用来标识寄存器,Mod字段 与 R/M字段共同用来标识寄存器与内存。但3-5字段,并不仅仅用来标识寄存器,有些时候,用来标识Opcode。

参见Table A-2中
逆向初级-硬编码(六)
80 81 82 83 这几个编码,并没有明确给出具体的操作码是什么。

特别说明:凡是出现Grp的,均参见TableA-6
逆向初级-硬编码(六)
举例说明:80 65 08 FF

1.第一个字节为80 查Table-2表,得到对应结构:Eb,Ib

2.第二个字节为ModR/M字段,所以拆分65:

​ 01 100 101

Mod 与 R/M字段 查Table2-2 得到对应的结构:[EBP+DIS8]

3.100 字段 查表TableA-6 得到对应操作码为:AND
逆向初级-硬编码(六)
4.最终指令格式

AND [ebp+dis8],Ib

AND BYTE PTR SS:[EBP+08],0xFF
逆向初级-硬编码(六)

6.6.经典变长指令_SIB字段

ModR/M字段是用来进行内存寻址的,可当地址形如DS:[EAX + ECX*2 + 12345678]时,仅仅靠ModR/M字段,是描述不出来的。这时就在ModR/M后面增加一个SIB字节,与ModR/M字段共同描述。

下图是上两节没有涉及到的三种情况
逆向初级-硬编码(六)
这三种情况表示,在ModR/M字节后,还紧跟着一个SIB字节。SIB字节的8个位被分成了三部分:
逆向初级-硬编码(六)
举例说明:88 84 48 12 34 56 78

1.第一个字节为88 查Table-2表,得到对应结构:MOV Eb,Gb
逆向初级-硬编码(六)
2.第二个字节为ModR/M字段,所以拆分84:

​ 01 000 010
逆向初级-硬编码(六)
如果查看ModR/M结果是[--][--]+dis8,则还需要一个字节(SIB)来确定[--][--]里面的内容

3.SIB字节48分析
逆向初级-硬编码(六)
Base + Index*2Scale (Scale描述2Scale,所以只能为 *1 *2 *4 *8)

48拆分:01 001 000

[EAX + EXC*2]
逆向初级-硬编码(六)
4.结果

88 84 48 12 34 56 78 对应汇编 MOV BYTE PTR DS:[EAX+ECX*2+78563412],AL
逆向初级-硬编码(六)

上一篇:2、选择排序


下一篇:实验一 软件开发文档与工具的安装与使用