在C程序中运行hello world shellcode时的Segfault

时间:2017-10-05 01:20:27

标签: exploit shellcode assembly x86

抱歉,如果这个问题听起来很愚蠢,但我对shellcoding很陌生,而且我试图在32位Linux机器上运行一个hello world示例。

由于这是shellcoding,我使用了一些技巧来删除空字节并缩短代码。这是:

section .data

section .text
global _start
_start:

;Instead of xor eax,eax
;mov al,0x4
push byte 0x4
pop eax
;xor ebx,ebx
push byte 0x1
pop ebx
;xor ecx,ecx
cdq ; instead of xor edx,edx

;mov al, 0x4
;mov bl, 0x1
mov dl, 0x8
push 0x65726568
push 0x74206948
;mov ecx, esp
push esp
pop ecx
int 0x80

mov al, 0x1
xor ebx,ebx
int 0x80

当我使用以下命令编译和链接它时,此代码工作正常:

$ nasm -f elf print4.asm
$ ld -o print4 -m elf_i386 print4.o

但是,我尝试在以下C代码中运行它:     $ cat shellcodetest.c     #包括     #include

char *shellcode = "\x04\x6a\x58\x66\x01\x6a\x5b\x66\x99\x66\x08\xb2\x68\x68\x68\x65\x69\x48\x54\x66\x59\x66\x80\xcd\x01\xb0\x31\x66\xcd\xdb\x80";

int main(void) {
    ( *( void(*)() ) shellcode)();
}
$ gcc shellcodetest.c –m32 –z execstack -o shellcodetest
$ ./shellcodetest
Segmentation fault (core dumped)

有人可以解释一下那里发生了什么吗?我尝试在gdb中运行代码并注意到esp发生了一些奇怪的事情。但正如我之前所说,我仍然缺乏真正理解这里发生的事情的经验。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您的shellcode不起作用,因为它没有以正确的字节顺序输入。您没有说明如何从文件print4中提取字节,但objdumpxxd都以正确的顺序提供字节。

$ xxd print4 | grep -A1 here
0000060: 6a04 586a 015b 99b2 0868 6865 7265 6848  j.Xj.[...hherehH
0000070: 6920 7454 59cd 80b0 0131 dbcd 8000 2e73  i tTY....1.....s
$ objdump -d print4

print4:     file format elf32-i386


Disassembly of section .text:

08048060 <_start>:
 8048060:       6a 04                   push   $0x4
 8048062:       58                      pop    %eax
 8048063:       6a 01                   push   $0x1
...

您需要做的更改是交换字节顺序,&#39; \ x04 \ x6a&#39; - &GT; &#39; \ X6A \ X04&#39 ;. 当我使用此更改运行您的代码时,它可以工作!

$ cat shellcodetest.c
char *shellcode = "\x6a\x04\x58\x6a\x01\x5b\x99\xb2\x08\x68\x68\x65\x72\x65\x68\x48\x69\x20\x74\x54\x59\xcd\x80\xb0\x01\x31\xdb\xcd\x80";
int main(void) {
        ( *( void(*)() ) shellcode)();
}
$ gcc shellcodetest.c -m32 -z execstack -o shellcodetest
$ ./shellcodetest
Hi there$