由于提到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