我编写了一个简单的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。
答案 0 :(得分:2)
包装器代码只使用malloc
来获取一块内存并将文件读入其中。但是现在堆内存不可执行,因此您会遇到段错误。您可以使用mprotect
标记所需的可执行页面。如果您决定将shellcode放在堆栈上,则需要打开可执行堆栈(-z execstack
选项gcc
)。