經典變長指令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 以及B: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:100   對應的是EBP

 I:010 以及B:00  對應是EDX

 

整個下來是mov dword ptr ss:[EBP+EDX+一個dword偏移],EBP

 

 

 這裡為什麼又有偏移:

 

Tags: