今天的我才第一次真的開始學習這個領域,但看起來需要會的先備知識真的蠻廣的。這邊應該會學習一些比較通用的觀念為主,比如 asm、overflow、ROP 之類的,雖然 asm 應該在前面 reverse 的主題就要先講才對。
不同架構之下的組語會有所不同,這邊以 x86-64 為例
MOV RAX, 10 ; 將數字 10 移動到 RAX 暫存器中
MOV RBX, RAX ; 將RAX暫存器的值移動到 RBX 暫存器中
ADD RAX, RBX ; 將 RAX 和 RBX 的值相加,結果存儲在 RAX 中
SUB RAX, 5 ; 將 RAX 的值減去 5,結果存儲在 RAX 中
INC RAX ; 將 RAX 的值 +1
DEC RBX ; 將 RBX 的值 -1
MUL RAX, RBX ; 將 RAX 和 RBX 的值相乘,結果存儲在 RAX 中
DIV RAX, 2 ; 將 RAX 的值除以 2,商數存在 RAX 中,餘數存在 RDX 中
AND RAX, RBX ; RAX 和 RBX 的位元與運算,結果存在 RAX 中
OR RAX, RBX ; RAX 和 RBX 的位元或運算,結果存在 RAX 中
XOR RAX, RBX ; RAX 和 RBX 的位元異或運算,結果存在 RAX 中
NOT RAX ; RAX 的位元非運算,結果存在RAX中
JMP Target ; 跳轉到標記為 Target 的程式碼位置
MOV RAX, 10
CMP RAX, 5 ; 比較 RAX 的值和 5
JGE Label ; 如果 RAX 大於或等於 5,則跳轉到 Label
MOV RAX, 10
CMP RAX, 10
JE EqualLabel ; 如果 RAX 等於10,則跳轉到 EqualLabel
JNE NotEqualLabel ; 如果 RAX 不等於10,則跳轉到 NotEqualLabel
CALL Function ; 呼叫 Function 函式
RET ; 從當前的函式返回
PUSH RAX ; 將 RAX 的值壓進堆疊
POP RBX ; 將堆疊頂部的值彈出到 RBX
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
結尾的指令序列搭配一些條件就可以做到控制流程。總之,今天就先到這邊吧 😵💫