2015-07-19 114 views
0

我已經編譯了一個基本的漏洞利用(基本上,C中的源碼不會利用任何東西,只是執行執行Bash的操作碼)。問題是當我執行二進制文件:「分段錯誤」。執行shellcode分段錯誤

這裏我做了什麼:

executeBash.asm(NASM)

section .text 
global _start 
_start: 
xor EAX, EAX   ; EAX = 0 
push EAX    ; "\0\0\0\0" 
push DWORD 0x68732F2F ; "//sh" 
push DWORD 0x6E69622F ; "/bin" 
mov EBX, ESP   ; arg1 = "/bin//sh\0" 
push EAX  ; NULL -> args[1] 
push EBX  ; "/bin//sh\0" -> args[0] 
mov ECX, ESP ; arg2 = args[] 
mov AL, 0X0B ; syscall 11 
int 0x80  ; excve("/bin//sh", args["/bin//sh", NULL], NULL) 

在終端:

prompt$ nasm -f elf32 executeBash.asm 
prompt$ ld -m elf_i386 executeBash.o -o executeBash 
prompt$ objdump -M intel,i386 -d executeBash 

executeBash:  file format elf32-i386 


Disassembly of section .text: 

08048060 <_start>: 
8048060: 31 c0     xor eax,eax 
8048062: 50      push eax 
8048063: 68 2f 2f 73 68   push 0x68732f2f 
8048068: 68 2f 62 69 6e   push 0x6e69622f 
804806d: 89 e3     mov ebx,esp 
804806f: 50      push eax 
8048070: 53      push ebx 
8048071: 89 e1     mov ecx,esp 
8048073: b0 0b     mov al,0xb 
8048075: cd 80     int 0x80 
prompt$ # "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" 
prompt$ ./executeBash 
$ exit 
prompt$ 

在ASM該漏洞完全運行。

exploitBash.c

void main() 
{ 
    char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69" 
         "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"; 
    void(*fp) (void); 
    fp = (void *)&shellcode; 
    fp(); 
} 


prompt$ gcc -m32 -fno-stack-protector -z execstack exploitBash.c -o exploitBash 
prompt$ ./exploitBash 
Segmentation fault 
+0

所以,你抱怨_Undefined behaviour_行爲會不確定? – Olaf

+0

@RossRidge amm,這是事實......那麼問題是什麼? – Joe

+0

@RossRidge我編輯了這行,因爲你說我的代碼不在堆棧中。現在用最新的參數進行編輯。分段故障。 – Joe

回答

6

你忘了設置edx所以它包含任何C代碼最後一次使用它,這就是不太可能是一個有效的環境指針。在獨立代碼中,由於程序的初始啓動狀態,edx恰好爲零。如果你使用strace,你可以看到execve-EFAULT返回,然後執行繼續通過你的代碼進入垃圾,然後真正的段錯誤。您可以修復例如像這樣的shellcode:(我包括int 0x80xor edx, edx

char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69" 
       "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\x31\xd2\xcd\x80"; 

+0

完美。但excve()的EDX是什麼?換句話說,爲什麼excve()執行必須爲零? – Joe

+1

'edx'是第三個參數,指向環境變量的指針。它也可能是'NULL'。參見[man execve](http://linux.die.net/man/2/execve)。 – Jester