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