在Linux(Fedora)hello.S上使用's-proc -e'执行程序集shellcode会返回SIGSEGV

时间:2014-09-06 16:26:53

标签: linux assembly nasm shellcode

我编写了一个简单的Linux程序集shellcode,打印出“Hello,world!”到stdout。

xor eax,eax  
xor ebx,ebx  
xor ecx,ecx  
xor edx,edx  
jmp short   string  
code:  
pop ecx  
mov bl,1  
mov al,13  
mov al,4  
int 0x80  
dec bl  
mov al,1  
int 0x80  
string:  
call    code  
db  'hellow, world!'

程序名称为hello.S。现在,编译代码:

$ nasm -o hello hello.S

$ ./s-proc -p hello

/* The following shellcode is 47 bytes long: */
char shellcode[] =
    "\x66\x31\xc0\x66\x31\xdb\x66\x31\xc9\x66\x31\xd2\xeb\x10\x66"
    "\x59\xb3\x01\xb0\x0d\xb0\x04\xcd\x80\xfe\xcb\xb0\x01\xcd\x80"
    "\xe8\xed\xff\x68\x65\x6c\x6c\x6f\x77\x2c\x20\x77\x6f\x72\x6c"
    "\x64\x21";


$ ./s-proc -e hello

Calling code ...

Segmentation fault

$ 

该程序是正确的,但它给出了错误。

关于s-proc:

s-proc是一个用于执行shellcode的C程序。使用ld命令使shellcode变大,我使用了s-proc。

可以找到s-pros.c的源代码herehere

1 个答案:

答案 0 :(得分:2)

包装器代码只使用malloc来获取一块内存并将文件读入其中。但是现在堆内存不可执行,因此您会遇到段错误。您可以使用mprotect标记所需的可执行页面。如果您决定将shellcode放在堆栈上,则需要打开可执行堆栈(-z execstack选项gcc)。