由於提到BSH,您的shellcode不包含消息字節。跳到MESSAGE
標籤,只是定義msg
字節之前調用GOBACK
程序是一個很好的舉措作爲味精的地址將是對堆棧返回地址的頂部可能被彈出到ecx
,其中味精的地址存儲。
但無論你和BSH的代碼有輕微的限制。 它包含NULL bytes (\x00)
當由所述函數指針解除引用這將被認爲是字符串的結尾。
周圍有這樣一個聰明的辦法。您存儲到eax, ebx and edx
的值是足夠小,分別訪問al, bl and dl
直接寫入一氣呵成各寄存器的下半字節。 高半字節可能包含垃圾值,因此可以進行着色。
b8 04 00 00 00 ------ mov $0x4,%eax
變得
b0 04 ------ mov $0x4,%al
31 c0 ------ xor %eax,%eax
不同於現有的指令集,所述新指令集不包含任何空字節。
所以,最後的方案是這樣的:
global _start
section .text
_start:
jmp message
proc:
xor eax, eax
mov al, 0x04
xor ebx, ebx
mov bl, 0x01
pop ecx
xor edx, edx
mov dl, 0x16
int 0x80
xor eax, eax
mov al, 0x01
xor ebx, ebx
mov bl, 0x01 ; return 1
int 0x80
message:
call proc
msg db " y0u sp34k 1337 ? "
section .data
組裝和鏈接:
$ for i in `objdump -d hello | tr '\t' ' ' | tr ' ' '\n' | egrep '^[0-9a-f]{2}$' ` ; do echo -n "\\x$i" ; done
輸出:
$ nasm -f elf hello.asm -o hello.o
$ ld -s -m elf_i386 hello.o -o hello
$ ./hello
y0u sp34k 1337 ? $
現在從打招呼二進制提取的shellcode
\xeb\x19\x31\xc0\xb0\x04\x31\xdb\xb3\x01\x59\x31\xd2\xb2\x12\xcd\x80\x31\xc0\xb0\x01\x31\xdb\xb3\x01\xcd\x80\xe8\xe2\xff\xff\xff\x20\x79\x30\x75\x20\x73\x70\x33\x34\x6b\x20\x31\x33\x33\x37\x20\x3f\x20
現在我們可以讓我們的驅動程序啓動shellcode。
#include <stdio.h>
char shellcode[] = "\xeb\x19\x31\xc0\xb0\x04\x31\xdb"
"\xb3\x01\x59\x31\xd2\xb2\x12\xcd"
"\x80\x31\xc0\xb0\x01\x31\xdb\xb3"
"\x01\xcd\x80\xe8\xe2\xff\xff\xff"
"\x20\x79\x30\x75\x20\x73\x70\x33"
"\x34\x6b\x20\x31\x33\x33\x37\x20"
"\x3f\x20";
int main(int argc, char **argv) {
(*(void(*)())shellcode)();
return 0;
}
有在現代編譯器等NX protection這防止在數據段或堆棧代碼執行某些安全功能。所以我們應該明確地指定編譯器來禁用它們。
$ gcc -g -Wall -fno-stack-protector -z execstack launcher.c -o launcher
現在可以調用launcher
來啓動shellcode。
$ ./launcher
y0u sp34k 1337 ? $
對於更復雜的shellcode,會有另一個障礙。現代Linux內核有ASLR或Address Space Layout Randomization
您可能需要在注入shellcode之前禁用它,尤其是在通過緩衝區溢出時。
[email protected]:~# echo 0 > /proc/sys/kernel/randomize_va_space
不知道爲什麼你沒有得到任何upvotes,但這是一個很好的答案。謝謝您的幫助。 – 2013-05-03 13:48:31
空字節應該被移除以執行shellcode tho – REALFREE 2013-10-14 04:14:25
@REALFREE如果您使用函數需要空終止字符串(如字符串函數爲「strcpy」),則空字節將會成爲問題,它將不會讀取整個shellcode字符串。否則就沒關係。 – 2013-10-15 13:38:21