经典变长指令SIB
前言
ModR/M字段是用来进行内存寻址的,可当地址形如DS:[EAX + ECX*2 + 12345678]时,仅仅靠ModR/M字段,是描述不出来的。
这时就在ModR/M后面增加一个SIB字节,与ModR/M字段共同描述。
上一节说到opcode决定了是否有ModR/M字段,而opcode和ModR/M字段一起决定了SIB字段
可以看到再ModR/M后面,SIB这个值是否有取决于ModR/M的具体取值,其实就是上一节说的esp那个位置,ModR/M是空出来
SIB结构
首字母命名Scale Index Base SIB
SIB的描述方式为
Base + Index*2**Scale (Scale描述2Scale,所以只能为 *1 *2 *4 *8)
SIB图表
1、当Index = 100 时,Index被0替代,此时只有Base有效
2、当Base = 101 时,Base被0替代,此时只用Index有效
具体解析
0x89 2C 14
先看opcode 0x89
说明基本格式是MOV Ev, Gv : Gv与我当前的x32dedug决定了是32位的通用寄存器,具体是哪一个通用寄存器还要看ModR/M的3,4,5部分
ModR/M字段展开
00 101 100
5号寄存器
现在可以确定是 mov dword ptr ds:[xxxx],EBP
然后Mod R/M是00 100 决定了改指令有SIB字段
看SIB字段
00 010 100
对应的是S I B
用Base + Index*2**Scale这个公式
B:100 对应的是ESP
I:010 以及S:00 对应是EDX
整个下来是mov dword ptr ss:[ESP+EDX],EBP
这里为什么没有偏移呢,这个值还是由ModR/M字段说明,可以看到Mod为00,没有偏移,如果Mod为01或者10 ,后面依旧要更上1个字节的偏移或4个字节的偏移,这里不明白可以看上一节ModR/M的那张表
0x 89 AC 15
先看opcode 0x89
说明基本格式是MOV Ev, Gv : Gv与我当前的x32dedug决定了是32位的通用寄存器,具体是哪一个通用寄存器还要看ModR/M的3,4,5部分
ModR/M字段展开
10 101 100
5号寄存器
现在可以确定是 mov dword ptr ds:[xxxx],EBP
然后Mod R/M是10 100 决定了改指令有SIB字段
看SIB字段
00 010 101
对应的是S I B
用Base + Index*2**Scale这个公式
B:101
发现他是一个*,intel对此的解释
意思是:如果Mod是00的话,就没有base,其他情况还是【esp】+一个8位或者32位偏移,其他情况下面有专门的解释。我们这里Mod是10
I:010 以及B:00 对应是EDX
整个下来是mov dword ptr ss:[EBP+EDX+一个dword偏移],EBP
这里为什么又有偏移: