Linux 系統呼叫較少膨脹

在 32 位 Linux 中,系統呼叫通常是通過使用 sysenter 指令完成的(我說通常是因為較舊的程式使用現已棄用的 int 0x80)但是,這可能佔用程式中相當多的空間,因此有一些方法可以偷工減料以縮短和加快速度。
這通常是 32 位 Linux 上系統呼叫的佈局:

mov eax, <System call number>
mov ebx, <Argument 1> ;If applicable
mov ecx, <Argument 2> ;If applicable
mov edx, <Argument 3> ;If applicable
push <label to jump to after the syscall>
push ecx
push edx
push ebp
mov ebp, esp
sysenter

這是非常正確的! 但是我們可以採取一些技巧來避免這種混亂。
第一種是將 ebp 設定為 esp 的值減去 3 個 32 位暫存器的大小,即 12 個位元組。這很好,只要你可以用垃圾覆蓋 ebp,edx 和 ecx(例如,無論如何你將直接將值移入這些暫存器),我們可以使用 LEA 指令執行此操作,這樣我們就不需要了影響 ESP 本身的價值。

mov eax, <System call number>
mov ebx, <Argument 1>
mov ecx, <Argument 2>
mov edx, <Argument 3>
push <label to jump to after the syscall>
lea ebp, [esp-12]
sysenter

但是,我們還沒有完成,如果系統呼叫是 sys_exit,我們就可以轉義不向堆疊推送任何東西!

mov eax, 1
xor ebx, ebx ;Set the exit status to 0
mov ebp, esp
sysenter