逆向初级-硬编码(六)

2021-04-20 10:53:42 浏览数 (1)

6.1.前缀指令

1、硬编码的结构

2、前缀指令是分组的

代码语言:javascript复制
<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

代码语言:javascript复制
0x40 - 0x47    INC ERX     加1
0X48 - 0X4F    DEC ERX	   减1

测试

3、MOV Rb,Ib

代码语言:javascript复制
0xb0 - 0xb7      MOV Rv,Ib     //后面跟1个字节的立即数

4、MOV ERX,Id

代码语言:javascript复制
0xb8 - 0xbF	      MOV ERX,Id    //后面跟4个字节的立即数

5、XCHG EAD,ERX

代码语言:javascript复制
0x90 - 0x97 XCHG EAX,ERX

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

1、0x70 - 0x7F

2、0x0F 0x80 - 0x0F 0x8F

3、其它指令

4、其它指令

6.4.经典变长指令_ModRM

1、经典变长指令_ModR/M

代码语言:javascript复制
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

0 人点赞