iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
1
Security

逆向工程 – 從入門到放棄系列 第 9

Day9 - 閒來無事,何不來學學 Intel x86 指令?

今天來正式介紹一下 Intel x86 的指令。雖然前面已經偷渡了很多次XD,不過這裡分門別類的描述各個指令的使用時機。有點多,不過還是請讀者慢慢服用。

複製資料

前面出現了很多次,也就是使用 mov 指令來複製資料,其語法如下,

mov destination, source

舉例來說,mov EAX, 10 等同於 EAX = 10

基本運算

就是國小數學的加、減、乘、除,只不過用電腦看得懂的方式表示,其語法如下,

add destination, source
sub destination, source
mul register
div register

inc destination
dec destination

第1行代表的是,destination = destination + source
第2行代表的是,destination = destination - source
第3行代表的是,EDX:EAX = EAX * register
可能讀者會覺得很奇怪,為什麼 mul 跟 div 只吃一個參數?詳情請見這篇討論串,簡單來說,mul 與 div 的第一個參數都被寫死了,因此在運算的時候,自然就不需使用者再給定。
第5-6行分別代表的是,destination 加一與減一。

呼叫函式

就是呼叫 function!

call label
ret
push item
pop [register]

第1行代表的是,push EIP 並跳過去該記憶體位置
第1行代表的是,pop EIP 並且回去
第1行代表的是,將資料推入 Stack
第1行代表的是,將資料從 Stack拿出並且存入該暫存器
(若忘記什麼是 Stack,可以參考 Day5 的 Stack 介紹)

Bitwise 操作

位元的操作,包括AND、OR、XOR、Shift 等等操作。這方面的延伸的技巧不可思議的多,比方說如何透過 Bitwise 操作避免使用迴圈以提升程式運行效率(可以參考jserv 大大的文章,很詳細!)

and destination, source
or destination, source
xor destination, source
shl destination, count
shr destination, count

先說一個16進位的表示式我每次都要看很久,所以我把它整理在這裡,如下圖,

這樣就不用每次都在那邊煩惱這到底是什麼意思了XD
我是這樣在記邏輯關係:AND 的邏輯,兩者皆真才真;OR 邏輯,有一真,則為真;XOR 邏輯,兩者相同,則為非。shl 與 shr 代表的是位元的搬移。

條件

比較值得一提的是,組合語言裡面沒有 for 迴圈的指令,取得代之的是用 jmp 的指令搭配 label 來營造出迴圈的結果。

cmp variable, standard
je/jne label
jg/jge label
jl/jle label
test register, immediate address
jz/jnz label
jmp label
jmp register

cmp 與 test 都是用來做比較的,只不過 test 是用 bitwise 來做比較。其共同點是,需要在後面立即加上跳躍的指令。因為 cmp 回傳的結果可能大於、等於、小於,因此對各自狀況使用 jg (jump greater than),je(jump equal),jl (jump less than),以達到各自的目標。而 test 的回傳結果就只有等於0或不等於0,因此,使用 jz (jump zero),jnz (jump not zero),以達到其目標。

雜項

nop
hlt

nop 的代碼(opcode)是0x90,意思是說不要執行;hlt 代表的是停止 CPU

Opcode

最後給大家看一下 x8 6指令所對應到 opcode,就跟九九乘法表一樣XD。若能熟記,離懂電腦又更近一步!

Reference

總結

學完這些,再回頭看第一天的用組語寫的 Helloworld,就可以有更深入的了解。此外,本篇的重要性不在話下(除了Opcode),因為逆向程式的時候,看到的就全都是以上述的指令(但不限於)在飛來飛去,因此希望讀者可以心中有個譜,或是再回來參考!


上一篇
Day8 - 組合語言 - 不可不知的定址模式 - 下篇
下一篇
Day10 - Syscall 好像時常聽到?到底是什麼?
系列文
逆向工程 – 從入門到放棄30

尚未有邦友留言

立即登入留言