在任何代码运行之前发生分段错误程序集

时间:2013-12-27 06:01:15

标签: linux assembly shellcode

我正在尝试编写一个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。

任何人都可以指出我正确的方向,以便我能弄清楚如何解决这个问题吗?

1 个答案:

答案 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