iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0

前言

今天的我才第一次真的開始學習這個領域,但看起來需要會的先備知識真的蠻廣的。這邊應該會學習一些比較通用的觀念為主,比如 asm、overflow、ROP 之類的,雖然 asm 應該在前面 reverse 的主題就要先講才對

組合語言

不同架構之下的組語會有所不同,這邊以 x86-64 為例

常用指令

  1. MOV:資料傳輸指令,用於將資料從一個位置移動到另一個位置。
MOV RAX, 10  ; 將數字 10 移動到 RAX 暫存器中
MOV RBX, RAX ; 將RAX暫存器的值移動到 RBX 暫存器中
  1. ADD / SUB:加法和減法指令,用來進行數學運算。
ADD RAX, RBX ; 將 RAX 和 RBX 的值相加,結果存儲在 RAX 中
SUB RAX, 5   ; 將 RAX 的值減去 5,結果存儲在 RAX 中
  1. INC / DEC:遞增和遞減指令,用來對暫存器或記憶體中的數字進行 +1 或 -1 操作。
INC RAX      ; 將 RAX 的值 +1
DEC RBX      ; 將 RBX 的值 -1
  1. MUL / IMUL / DIV / IDIV:乘法和除法指令,用來執行整數乘法和除法操作。
MUL RAX, RBX ; 將 RAX 和 RBX 的值相乘,結果存儲在 RAX 中
DIV RAX, 2   ; 將 RAX 的值除以 2,商數存在 RAX 中,餘數存在 RDX 中
  1. AND / OR / XOR / NOT:位元運算指令,就是 bitwise operation。
AND RAX, RBX ; RAX 和 RBX 的位元與運算,結果存在 RAX 中
OR  RAX, RBX ; RAX 和 RBX 的位元或運算,結果存在 RAX 中
XOR RAX, RBX ; RAX 和 RBX 的位元異或運算,結果存在 RAX 中
NOT RAX      ; RAX 的位元非運算,結果存在RAX中
  1. JMP:無條件跳躍指令,用來無條件跳轉到程式的其他部分。
JMP Target   ; 跳轉到標記為 Target 的程式碼位置
  1. CMP:比較指令,用來比較兩個數值的大小,並設置相應的 flag。通常比較完會接下一個的條件跳躍指令來達到流程控制。
MOV RAX, 10
CMP RAX, 5   ; 比較 RAX 的值和 5
JGE Label    ; 如果 RAX 大於或等於 5,則跳轉到 Label
  1. JE / JNE / JZ / JNZ(還有很多種):條件跳躍指令,根據不同的條件(等於、不等於、為零、不為零)跳轉到程式的其他部分,判斷方式是讀 FLAGS 暫存器。
MOV RAX, 10
CMP RAX, 10
JE  EqualLabel    ; 如果 RAX 等於10,則跳轉到 EqualLabel
JNE NotEqualLabel ; 如果 RAX 不等於10,則跳轉到 NotEqualLabel
  1. CALL:呼叫指令,用來呼叫函式。
CALL Function  ; 呼叫 Function 函式
  1. RET:返回指令,用來從函式返回。
RET            ; 從當前的函式返回
  1. PUSH / POP:壓進堆疊和彈出堆疊指令,用於處理堆疊中的資料。
PUSH RAX       ; 將 RAX 的值壓進堆疊
POP  RBX       ; 將堆疊頂部的值彈出到 RBX
  1. LEA:將記憶體地址載入暫存器,但不讀取記憶體中的資料。
LEA RAX, [RBX + 10] ; 將(RBX + 10)的記憶體地址載入RAX

暫存器

上面提到了很多暫存器,這個部分來介紹一下常用的暫存器有哪些:

64-bit 32-bit 說明
RAX EAX 累加器(Accumulator)
RBX EBX 基底暫存器(Base register)
RCX ECX 計數暫存器(Counter)
RDX EDX 資料暫存器(Data)
RSI ESI 來源索引暫存器(Source Index)
RDI EDI 目標索引暫存器(Destination Index)
RBP EBP 基底指標暫存器(Base Pointer)
RSP ESP 堆疊指標暫存器(Stack Pointer)
R8 R8D 附加暫存器8
R9 R9D 附加暫存器9
R10 R10D 附加暫存器10
R11 R11D 附加暫存器11
R12 R12D 附加暫存器12
R13 R13D 附加暫存器13
R14 R14D 附加暫存器14
R15 R15D 附加暫存器15

Ref: https://learn.microsoft.com/zh-tw/windows-hardware/drivers/debugger/x64-architecture
微軟的文件,但是看起來很像機翻

後記

本來是想跳過組合語言不寫,不過終究還是得還的 XD。基本上組合語言 & reverse 在 pwn 的領域應該還是算基本技能。比如 ROPgadget 就是在程式中找到可利用的片段,以 RET 結尾的指令序列搭配一些條件就可以做到控制流程。總之,今天就先到這邊吧 😵‍💫


上一篇
Day 22. Reverse - 實戰(下)
下一篇
Day 24. Pwn - 保護機制
系列文
進了資安公司當後端 RD 才入門資安會不會太晚了30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言