系统调用导致分段错误

时间:2014-06-18 00:02:57

标签: linux assembly x86 32-bit

我正在汇编一个简单的程序,应该调用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在? ()
  执行不属于已知函数

我是新来的大会所以很抱歉,如果这是一个noob错误。

更新

我已将我在此处发布的内容完全复制并粘贴到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$ 

1 个答案:

答案 0 :(得分:1)

发生了什么,setreuid在成功时返回零,在出错时返回-1。您可能以普通用户身份运行,不允许设置该进程的用户ID。因此,setreuid的返回值为-1,二进制是为eax设置的所有位。通过将al设置为0x01,您只需将最低有效字节设置为1.高位都已设置,因此您实际上并未在eax中传递1。您有效地传递了FFFFFF01。这不是一个有效的系统调用,更不用说退出调用了。当它到达第二个int 0x80时,它继续执行下一条指令,它不允许读取。另一件事是,你应该使用mov ebx,0作为退出调用。事实上,你以前曾经发过ebx ebx,但这是一个等待发生的潜在错误。