iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
1
Security

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

Day10 - Syscall 好像時常聽到?到底是什麼?

介紹

Syscall (system call),中文翻成系統呼叫,可以把它理解成系統的 API (Application Programming Interface),目的是用來串接使用者與 kernel 空間。用一張圖(如下圖)可以解釋這個概念,Syscall 好比一道橋樑,用來將使用者空間的請求發送到 kernel 的空間。


Reference

Syscall 步驟

  1. 將 syscall 代碼推到 EAX 暫存器
  2. 將其他變數儲存到 EBX, ECX 暫存器
  3. 中斷(0x80)
  4. 再從 EAX 暫存器將值取出

舉例來說,以下是系統呼叫 sys_exit

mov eax, 2
int 0x80

先將 EAX 設定為2後(代表準備 fork),再呼叫 kernel 開始動作。再舉一個系統呼叫 sys_write 例子:

mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, 100
int 0x80

透過查表法(下表),先確定你要的動作需要哪些暫存器,再將其個別填入,即可完成呼叫該 Syscall。這裡的 EAX 填4,代表要輸出;EBX 填1代表是檔案描述符是 stdout;ECX 是你所想寫的資料;EDX 是資料長度。

分類

常見的system call

不過我在寫的時候,有發現一個很特別的地方 - 32bits 與 64bits 的系統呼叫方式在 Mac OS 有些差異。比方說,同樣都是輸出的 Syscall,32bits 的程式是:

mov eax, 4

而 64bits 是:

mov rax, 0x2000004

64bits 就是要是比 32bits 多加了 0x2000000 XD

結論

程式從寫完到編譯,到底經過了哪些流程?明日揭曉


上一篇
Day9 - 閒來無事,何不來學學 Intel x86 指令?
下一篇
Day11 - 如何生出 Hello world 小孩 - 理論篇
系列文
逆向工程 – 從入門到放棄30

尚未有邦友留言

立即登入留言