Linux-Kernel
Linux 核心 3.2 系統呼叫
只是試圖獲取以下程式碼的 <__execve> 的彙程式序指令,因為我想建構 shell spawn 操作碼列表:
#include <stdio.h> int main() { char *happy[2]; happy[0] = "/bin/sh"; happy[1] = NULL; execve (happy[0], happy, NULL); }
Objdump 給了我這個:
8053a20: 53 push %ebx 8053a21: 8b 54 24 10 mov 0x10(%esp),%edx 8053a25: 8b 4c 24 0c mov 0xc(%esp),%ecx 8053a29: 8b 5c 24 08 mov 0x8(%esp),%ebx 8053a2d: b8 0b 00 00 00 mov $0xb,%eax 8053a32: ff 15 a4 d5 0e 08 call *0x80ed5a4 8053a38: 3d 00 f0 ff ff cmp $0xfffff000,%eax 8053a3d: 77 02 ja 8053a41 <__execve+0x21> 8053a3f: 5b pop %ebx 8053a40: c3 ret 8053a41: c7 c2 e8 ff ff ff mov $0xffffffe8,%edx 8053a47: f7 d8 neg %eax 8053a49: 65 8b 0d 00 00 00 00 mov %gs:0x0,%ecx 8053a50: 89 04 11 mov %eax,(%ecx,%edx,1) 8053a53: 83 c8 ff or $0xffffffff,%eax 8053a56: 5b pop %ebx 8053a57: c3 ret 8053a58: 90 nop 8053a59: 90 nop 8053a5a: 90 nop
從我讀過的幾篇文章中,上面的輸出中應該有一個int 0x80。為什麼沒有一個?
3.2 核心中是否有任何關於系統呼叫如何工作的重大變化,這些變化可能會影響 3-4 年前寫的書中介紹的 shellcode 建構算法(特定寄存器載入等)?上面的轉儲看起來與“Shellcoders Handbook”或“Smash the Stack”中呈現的輸出非常不同
謝謝!
系統呼叫實現依賴於硬體(嚴重) - 請參閱關於syscalls的維基百科文章和關於kerneltrap的文章。在現代 x86 上,它似乎
int 0x80
已在一段時間前被新的SYSENTER
et al所取代。對我來說 __execve 看起來像這樣:
000000000040f7c0 <__execve>: 40f7c0: b8 3b 00 00 00 mov $0x3b,%eax 40f7c5: 0f 05 syscall 40f7c7: 48 3d 00 f0 ff ff cmp $0xfffffffffffff000,%rax 40f7cd: 77 02 ja 40f7d1 <__execve+0x11> 40f7cf: f3 c3 repz retq 40f7d1: 48 c7 c2 c0 ff ff ff mov $0xffffffffffffffc0,%rdx 40f7d8: f7 d8 neg %eax 40f7da: 64 89 02 mov %eax,%fs:(%rdx) 40f7dd: 48 83 c8 ff or $0xffffffffffffffff,%rax 40f7e1: c3 retq 40f7e2: 66 90 xchg %ax,%ax 40f7e4: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 40f7eb: 00 00 00 40f7ee: 66 90 xchg %ax,%ax
注意
syscall
開頭的。函式的確切形式取決於編譯標誌和編譯程式碼的體系結構 - 請參閱gcc
選項-mtune
和-march
.**編輯:**其他有趣的連結: