2014-06-18 149 views
0

我在程序集中編寫了一個簡單程序,該程序應該調用setreuid(0,0),然後調用exit()。這裏是我的代碼:系統調用導致分段錯誤

section .text ; start code section of assembly 
global _start 
_start: 
xor eax, eax ; setruid call 
mov al, 0x46 ; get ready for setreuid system call 
xor ebx, ebx ; arg 1 (0) 
xor ecx, ecx ; arg 2 (0) 
int 0x80 ; interrupt for setreuid 
mov al, 0x01 ; prepare for exit call 
int 0x80 ; interrupt for exit <---- 0x0804806c 

當我運行此通過gdb它得到0x0804806c,然後將其與消息崩潰:在

0x0804806e? ()
執行不是一個已知函數

我是新來的裝配很抱歉,如果這是一個小白錯誤內。

更新

我有複製並粘貼正是我已經張貼在這裏爲exit.asm。然後我就用下面的命令編譯exit.asm

nasm -f elf exit.asm # elf file format for 32-bit linux 
ld -o exit exit.o # link 

這將產生程序exit。當運行它,我得到以下幾點:

****@debian:~/shellcode$ ./exit 
Segmentation fault 
****@debian:~/shellcode$ 
+4

您應該在第二個系統調用之前重新調零'eax'。第一個系統調用的返回值在那裏,如果它設置了任何'mov al,0x01'不重置的位,你最終會調用其他的調用。 –

+2

爲什麼不只是'mov eax,0x46'和'0x01'? –

+0

@AndrewMedico偉大的想法,我試過了,但它仍然崩潰。 – John

回答

1

發生了什麼事是,setreuid成功返回零和1的錯誤。您可能以普通用戶身份運行,不允許設置進程的用戶標識。因此,setreuid的返回值是-1,在二進制中是爲eax設置的所有位。通過將al設置爲0x01,您只將最低有效字節設置爲1.高位全部設置,所以您實際上並未在eax中傳遞1。您正在有效傳遞FFFFFF01。這不是一個有效的系統調用,更不用說退出調用了。當它到達第二個int 0x80時,它繼續前進到下一條不允許讀取的指令。另一件事是,你應該mov ebx,0退出調用。剛纔你發現了ebx,但這是一個潛在的錯誤,等待發生。