iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0
Security

資訊安全的美味雜炊系列 第 17

[Day17] - Rev 0x2 組合語言

  • 分享至 

  • xImage
  •  

Day17 - Rev 0x2 組合語言

前言

  • 為何要學組合語言呢,因為組合語言是最接近底層的語言,透過了解組合語言能夠更清楚電腦核心的運作,另外更能清楚了解反編譯的出來的程式碼

指令集

CISC(複雜指令集)

  • 早期CPU都是CISC
    • 由各種複雜的指令,命令電腦做一個動作,在一個clock內可完成
    • 缺點
      • 少數指令不常使用,執行機會少
      • 程式設計者不需要寫一大堆指令去完成一項複雜的任務
  • 例子
    • Intel X86

RISC(精簡指令集)

  • 固定常用指令長度
  • 優點
    • 不常用的指令,用軟體模擬執行,減少空間
    • 多餘空間增加Register, 加大cache
    • 減少電晶體、面積縮小、耗電量低
  • 例子
    • ARM

CPU架構

ARM

  • 功能比X86簡單
  • 耗電量較低,低成本、低耗能

X86

  • 最早由Intel發展的「Intel8086」CPU
  • 其後CPU結尾為86,因此架構被稱為X86
  • 功能比ARM強,較為普及

x86組合語言

暫存器 (Register)

  • 資料暫存器: 給cpu運算之整數資料
  • 位址暫存器: 用來存記憶體位址的暫存器,可以用來存取記憶體
  • 通用目的暫存器: 可以用來存資料或位址(同時是資料暫存器和位址暫存器)
  • 浮點暫存器: 用來存浮點數字
  • 區段暫存器: 用來記錄每一區段開始的address
32bits 64 bits 功能
EAX RAX 累加暫存
EBX RBX 基底暫存
ECX RCX 計數器
EDX RDX 來源(source)的索引
  • 64位元的暫存器效率比32位元好

  • ESI, EDI 索引暫存器

    • ESI:用來存來源(source)的索引
    • EDI:用來存目標(destination)的索引
  • EBP, ESP

    • EBP
      • 紀錄stack的bottom(第一個被push進來)
    • ESP
      • 紀錄stack的top(最後被push進來)
  • CS、SS、ES、DS

    • CS(code segment):紀錄程式開始的位置
    • SS(stack segment): 紀錄stack底部位置(stack開始存放東西)
    • ES(extra segment):額外的segment
    • DS(data segment):紀錄資料從記憶體的哪個位置開始放
  • flag

    • ZF(zero flag):目前指令的計算結果為0則ZF=1,反之ZF=0
    • SF(sign flag):目前指令的計算結果為負數則SF=1,反之SF=0
    • OF(overflow flag):目前指令的計算結果有overflow則OF=1,反之OF=0
    • PF(parity flag):目前指令的計算結果有偶數個1則PF=1,反之PF=0
    • CF(carry flag):無號數做運算時過大或過小時為1,反之為0(像是無號數的OF)
    • DF(Direction Flag):決定字串讀取時由記憶體位址的高位讀到低位(小端序)還是低位讀到高位(大端序),DF=0時為小端序,反之DF=1為大端序
  • Little-endian v.s. Big-endian

    • Little-endian:

      • 最低位的byte會放在最低的記憶體位址
      • X86為Little-endian
    • Big-endian

      • 最高位的byte會放在最低的記憶體位址

參考自:https://blog.gtwang.org/programming/difference-between-big-endian-and-little-endian-implementation-in-c/

指令

  • MOV
    • 將temp的直放到eax內
    • 注意:兩個參數的size要一樣
mov eax, temp
  • MOVZX
    • temp的size比eax小時可以用MOVZX將temp的值放到eax內,不夠的部分會用0補到和eax一樣大
    • 注意: temp的size一定要小於eax,等於也不行
movzx eax, tmp
  • push, pop
    • 將eax的值放到stack的頂端
    • 將stack頂端的值pop到eax內
push eax
pop eax
  • ADD, SUB
    • 將eax和temp相加,並把運算完的值存到eax內
    • 將eax減ebx,並把運算完的值存到eax內
add eax, temp
sub eax, temp
  • CMP
    • 將eax減掉ebx但是不保存運算完的值,只改動eflags
cmp eax, ebx

邏輯運算指令

  • AND
    • 將eax和temp做and運算,並把運算完的值存到eax內
and eax, temp
  • OR
    • 將eax和temp做OR運算,並把運算完的值存到eax內
or eax, temp
  • XOR
    • 將eax和temp做XOR運算,並把運算完的值存到eax內
xor eax, temp
  • TEST
    • 做AND但不影響registers/mem的值
test eax, temp

跳轉指令

  • Jmp [地址] 無條件轉移(JUMP)

  • jz, je 等於時跳轉

    • ZF=1時跳轉
mov eax, 10
mov ebx, 20

cmp eax, ebx
je hello

;b

hello:
    ; a
  • jnz, jne 不等於時跳轉
    • ZF=0時跳轉
    • ZF=1代表運算完(相減)的值不為0(表示兩個數字不同)
mov eax, 10
mov ebx, 20

cmp eax, ebx
jne aaa

;equal state

aaa:
    ;not equal state

  • call

    • 呼叫某個Procedure,並把return address放到stack中
    • CALL [Procedure(像是C語言的function) name]
  • ret

    • 從呼叫的函式回到原本呼叫的地方(像C的return)

呼叫function會做的事

  1. push 函式要求的參數進stack
  2. push return address進stack
  3. push ebp
  4. 分配給空間給Local variable
push 2
push 1
call qq
push ebp
mov ebp,esp
sub esp,4
mov [ebp-4],5

結束函式

mov esp,ebp
pop ebp
ret (pop eip)
add esp,8

x86指令表

有興趣的捧油可以自行研究


上一篇
[Day16] - Rev 0x1 介紹
下一篇
[Day18] - Rev 0x3 Android
系列文
資訊安全的美味雜炊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言