我正在尝试编写一个shell代码程序,它将调用execve并生成一个shell。我正在使用为this class提供的32位虚拟机。代码如下:
section .text
global _start
_start:
;clear out registers
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
;exacve("/bin/sh",Null,NULL)
;ascii for /bin/sh;
;2f 62 9 6e 2f 73 68 3b
push 0x3b68732f
push 0x6e69622f
mov ebx, esp
mov al, 11
int 0x80
;exit(int status)
movv al, 1
xor ebx, ebx
int 0x80
我使用nasm -f elf -g shell.asm
进行编译并与ld -o shell shell.o
相关联
当我尝试运行它时,我遇到了分段错误。我尝试使用gdb来查看我犯了哪些错误,但是,即使在_start + 0处设置了一个断点,它也会出现段错误。它表示在代码的最后一条指令之后,地址处存在段错误。
即如果最后一行的地址为0x804807c,则在任何代码有机会运行之前,分段错误发生在0x804807e。
任何人都可以指出我正确的方向,以便我能弄清楚如何解决这个问题吗?
答案 0 :(得分:1)
代码中的一个错误是,字符串的ascii代码中没有0x3b
:
;exacve("/bin/sh",Null,NULL)
;ascii for /bin/sh;
;2f 62 9 6e 2f 73 68 3b
push 0x3b68732f
push 0x6e69622f
以下代码将解决此问题(假设您使用小端机器):
;exacve("/bin/sh",Null,NULL)
;ascii for /bin/sh;
;2f 62 99 6e 2f 73 68 00
push 0x0068732f
push 0x6e69622f