c++ 跳转到上级目录_Windows漏洞利用开发 第4部分:使用跳转定位Shellcode 模块

9bc7d2e2577e363cf9d9d6c8cad677d2.gif

概观

在第2和第3部分中,我们构建并改进了ASX To MP3转换器的一个漏洞利用。尽管它存在缺陷,但就漏洞而言,它非常简单直接—— 直接利用指向我们shellcode的寄存器从而直接跳转到EIP覆盖。事情并不总是那么容易。通常你必须做更多的工作来让应用程序执行到你的shellcode。在本系列的这一部分中,我们将研究如何在漏洞利用中使用跳转代码。具体来说,我们将看看如何操作寄存器和栈,并使用条件/无条件跳转来构造自定义跳转代码,以便成功实现和执行shellcode

跳转到Shellcode

在我们的第一个例子中,我们很幸运,因为我们有一个寄存器(EBX)直接指向我们shellcode的一个不间断部分,这意味着我们只需要一个调用/ jmp指令来执行它。如果一个寄存器只指向我们的缓冲区中shellcode的一小部分,会发生什么?或者,如果指向点接近,但不完全在我们的缓冲区?或者,如果没有寄存器指向我们的shellcode,但是我们在堆栈上看到了一个地址。在这些情况下,除了迄今为止我们使用的标准调用/ jmp指令外,我们还有几个选项。当涉及到跳转代码时,我喜欢在以下方面考虑可用的选项:

1.操作寄存器

通过添加/减去寄存器并跳转到修改后的地址(add / sub [reg] + jmp)

通过查找跳转到寄存器偏移量的指令(jmp reg + offset)



2.操作堆栈

通过将我们选择的地址推入堆栈并发出返回(push + ret)

通过从堆栈中弹出一系列地址并发出返回(pop + ret或popad + ret)



3.使用无条件和有条件跳转跳转到shellcode

我们仔细看看......

操作寄存器

1. add [reg] + jmp

当你运气不佳,虽然寄存器直接指向缓冲区的一部分,它也可能不是允许立即执行shellcode的位置。但是,您可能会增加/减少寄存器中的地址,然后强制应用程序跳转到该地址。

为了说明这个技巧,我将介绍另一个基于m3u的漏洞攻击,这次是CoolPlayer + v2.19.4(本文写作时的最新版本)。您可以从Exploit-DB下载此应用以及已发布的漏洞利用版本:

http :   //www.exploit-db.com/exploits/29613/

将应用程序安装在C:\中,以便您可以跟随本教程的其余部分。

首先,漏洞利用实际上取决于生成的m3u文件的位置,就像我们之前的ASX To MP3播放器示例一样。

其次,为了使漏洞工作,CoolPlayer + 可执行文件必须从安装它的目录运行。这意味着如果您想调试此漏洞(我们将会),您必须先启动Immunity Debugger,再双击位于C:\ CoolPlayer + Portable \中的CoolPlayer.exe),然后用Immunity附加CoolPlayer进程。在初始运行之后,您可以简单地使用Ctrl + F2在调试器中重新启动应用程序。一旦你安装了应用程序,创建一个只包含Metasploit模式的m3u文件。您可以使用以下任一选项:

Kali:/usr/share/metasploit-framework/tools/pattern_create.rb 10000> msfpattern.m3u



Mona:!mona pc 10000(将结果输出复制到m3u文件中)。

我们将改进已发布的漏洞利用,因此我们从头开始。首先启动CoolPlayer并将Immunity Debugger附加到正在运行的进程。

12c171cf450c347fe0ae6537a153f936.png

接下来,将包含Metasploit模式的m3u文件放置在C:\中,并使用CoolPlayer打开它,此时应用程序应该会崩溃,您应该在Immunity中看到与以下内容类似的内容:

bb9928669469e65b3ea596dcf3392bc4.png

注意EDX和EBX如何指向Metasploit模式的开始。ESP也指向模式的一部分,但不是开始。我们用mona来确定偏移量:

14313105e0c5e81cd27f7401d964b549.png

Mona告诉我们,EIP覆盖发生在偏移量260处(请记住,从第2部分可以看出,这是我定制的mona版本,因此您不会看到列出的其他偏移量)。它还证实EBX和EDX都指向我们的Metasploit模式缓冲区的开始,但EBX包含更长,不间断的部分(10,000字节与512字节)。ESP指向缓冲区的相当小的一部分。实际上,如果您在转储窗口中查看ESP,则可以确切地看到它在248个字节中被中断的位置。

1a130cf41fe563e3527b11b76a448bac.png

根据这些信息,我们希望使用EBX作为我们的目标寄存器。让我们开始通过验证对EIP的成功控制来构建我们的漏洞。

c3da543937bb3f73e0bbe9e2834f749a.png

将生成的m3u文件放置在C:\中,在Immunity(Ctrl + F2)中重新启动CoolPlayer +并打开m3u文件。

92c569433154bea482cb324dbc7d2398.png

现在我们已经验证了对EIP的控制,我们可以查找jmp/call EBX指令,以便我们可以重定向到我们的shellcode。再次,我们可以使用mona来做到这一点。

!mona find -type instr -s "call ebx"

如果您引用由mona创建的生成的find.txt文件,您将看到只有一个应用程序模块具有可行的指令。不幸的是,所有关联的地址都包含空字节。重复搜索“jmp ebx”会得到相同的结果,因此我们不得不使用OS模块。我将从kernel32.dll中选择一个地址:0x7c810395。我们现在有我们的“call ebx”地址,但EBX指向我们缓冲区的开始,而不是我们的shellcode。

请记住,由于这是一个直接的EIP覆盖,我们的漏洞缓冲区将被构建为类似于以下内容:

JUNK(抵消EIP)+ EIP + NOPS + SHELLCODE + FILL。

这意味着,如果我们保持原样,“call ebx”将跳回到我们缓冲区的开始处,变为$ junk而不是直接传给我们的shellcode。对于这种寄存器指向缓冲区开始的场景,理想的解决方案是在EIP覆盖之前简单地将SHELLCODE部分移动到开始位置。这里的问题是我们抵消EIP只有260个字符。当然,我们使用的calc.exe shellcode只有不到260个字符,但如果你想要做的不仅仅是打开计算器,会发生什么?

我们可以使用我们的“CALL EBX”指令跳转到缓冲区的开头,然后使用另一个自定义跳转代码序列来跳过我们的EIP覆盖并进入我们的NOPS和shellcode,而不是将自己限制在shellcode的一个小空间中。这个自定义跳转代码实际上会通过将所需数量的字节添加到其值来操作EBX寄存器,然后直接跳转到该更新的地址。

794d5507ee6ca9deffdf5a846da3ff09.png

让我们用CALL EBX指令更新我们的exploit脚本,然后在缓冲区的一开始放置一些中断,以确认我们可以成功地达到我们的自定义跳转代码。

5a53b739e8b3771fa5805862315cf26f.png

将m3u文件放在C:\并在CoolPlayer中打开:

fa1459101a66fa88885be9508dd1409e.png

我们已成功重定向到缓冲区的开始处。现在我们需要用一些跳转代码启动缓冲区。我们的跳转代码将执行以下操作:

将X添加到EBX,然后跳转到调整后的EBX,其中X =我们要跳转的字节数。我们应该添加多少X?

我们需要考虑260字节的偏移量和4字节的EIP。我们也想用NOPS作为目标,最好我们的跳转代码将会落在这个NOP底座的某个地方。由于在我们的EIP覆盖之后我们有足够的空间用于shellcode,因此让它以50 NOPS开头。考虑到用于覆盖EIP的四个字节,我们的NOP底座将占用我们缓冲区的字节265到315。因此,300的自定义跳转X可以跳到放在这个NOP内,并很好地流向后面的shellcode。所以,这个自定义跳转代码是什么样的?

为此,我们可以转向另一个方便的Metasploit工具,称为metasm。在kali,你可以得到它如下:

/usr/share/metasploit-framework/tools/metasm_shell.rb

这会产生一个metasm shell,您可以在其中输入汇编指令,它将返回shellcode的相关操作码。由于我们想要添加300到EBX,让我们在metasm中输入相应的Assembly命令并查看结果:

metasm add ebx, 300

"\x81\xc3\x2c\x01\x00\x00"

结果操作码的问题是它包含NULL字节。为了避免这种情况,我们尝试一个更小的100:

metasm add ebx, 100

"\x83\xc3\x64"

完美,没有空字节。为了使EBX增加300,我们只需要重复这个指令3次。在我们将EBX增加300之后,我们需要跳到它。使用metasm,获取jmp EBX的操作码如下:

jmp ebx

"\xff\xe3"

我们的跳转代码如下所示:

my $jmp = "\x83\xc3\x64" x 3; # add 300 to ebx

$jmp = $jmp . "\xff\xe3"; # jmp ebx

让我们更新我们的漏洞利用脚本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值