hi,你好!欢迎访问本站!登录
推文论坛
当前位置:首页 - 科技生活 - 正文

24小时黑客在线接单qq(黑客接单平台)-Firefox漏洞利用研究(二)

2020-11-18科技生活科技生活21162°c
A+ A-

  在Linux的js shell环境下利用成功了之后,我不禁开始思考,为什么每次都是在Linux环境下拿到一个shell呢?从一个CTF成长为一名真正的黑客还有多少路需要走?征服Windows环境下的漏洞利用真的有想像中那么难吗?好吧,不尝试一下怎么可能知道。不要做一个只会动嘴皮的“学术大佬”,让我们动手试试。

  环境的不同导致的第一个问题就是怎么样去调试。我们知道在Linux下面可以通过gdb以及python辅助的gdb脚本进行调试,可以很方便的。但是在windows下面只有windbg这个工具供我们使用。因此,适应这个调试器,是我们首先要做的事情。首先在windows 24小时黑客在线接单qq(黑客接单平台) 10应用商店当中下载Windbg 24小时黑客在线接单qq(黑客接单平台)Preview版本,然后选择,设定可执行文件为,参数为,同时设置起始文件夹为所在的目录。

  我们可以通过一个简单的例子来了解一下Windbg的使用。对于如下的代码

  首先在Windbg当中设置断点。然后执行,会发现程序在函数的开始处停止。并直接输出了的结果

  可以在View菜单当中选择在界面中增加,两个选项卡,查看反汇编代码以及寄存器的信息。根据上面输出的信息可以得出,代码中创建的Array数组在内存中的位置为,代码中创建的Uint32Array数组在内存中的位置为。两个数组之间相距0x80,这和我们之前24小时黑客在线接单qq(黑客接单平台) 在Linux环境下看到的数组之间的间隔不同。通过命令看一下内存中的数据分布情况,发现数组的地址为。这个地址中存放的数据就是存放在Array数组当中的数据。

  另外,紧跟着这个Array类型数组的后面是一个Uint32Array类型的数组,与Array类型数组不同的是,在这个类型的结构体当中,多了一个的属性。这个属性存储的是。这个属性中的值指向了程序的段。如果能够泄漏这个属性当中的内容,就能够计算出在系统中的加载地址。

  除了的属性之外,紧接着后面分别是,,,以及。其中直接指向了后面8个字节的内容。指向的内存地址在同一页当中。

  在大致熟悉了Windbg调试器的使用方式了之后就可以开始继续进行漏洞利用了。这里使用的例子依然是最开始时我们用的的漏洞。这个漏洞的详细分析有很多的文章都已经介绍过了,这里就不过多赘述。我们想要达到的效果仅仅是通过这个漏洞,熟悉Windows环境下浏览器软件的漏洞利用流程。

  现代的操作系统,无论是Linux还是Windows,由于地址随机化的加入,漏洞利用首先要完成的都是要想办法泄漏程序或者dll的加载地址。以此为依据计算想要使用的函数地址,构造ROP实现任意代码执行。

  这里的做法是首先找到和Biggie数组(之前已经将其长度修改成了0x42424242)相邻的数组。首先24小时黑客在线接单qq(黑客接单平台)因为数组在存储数据的时候会先找到对应的然后通过加上的值获得要存储数据的地址。因此只要通过这个Biggie数组向后越界修改后面的一个数组的长度属性。然后再通过find找到后面这个数组就能够完全掌控后面相邻数组的了。掌握后面这个的之后就能够修改其中的数据从而能够从你写进去的地址读取数据。当然,前提是你写进去的数据地址是合法的,如果这个地址是非法的话会造成程序直接崩溃。具体的操作方法如下:

  因为中是下一个相邻Array的长度属性,因此和中存储的就是下一个相邻的Array的数据。修改了这里的两个数值之后读取中的内容就能够直接获得任意地址中的数据。

  与任意地址读的原24小时黑客在线接单qq(黑客接单平台)因相同,在修改了之后对赋值就能够做到任意地址写。当然,需要注意的是,因为是一个类型的数组,所以任意地址写的内容是一个32位的数。

  这个问题是让人比较困扰的一个问题,因为在Linux环境下,调用的动态链接函数地址会存储在二进制程序的GOT段当中,读取了这个地方就能够泄漏动态链接库的函数地址,从而计算出动态链接库的加载地址。但是显然在Windows环境下, 程序没有GOT段,那么应该读什么地方呢?是否有一个地方在读取了之后会和读取程序的GOT段有同样的效果,能够计算出程序动态链接库加载地址的值。

  首先通过命令查看加载了哪些dll当中的函数。其中有一个引人注意的24小时黑客在线接单qq(黑客接单平台)部分是

  可以看到他当中存在一个kernel32的IAT表。在这个表中存储的是kernel32以及ntdll这两个动态链接库中函数真实地址。在漏洞利用的过程中,可以直接读取表中的值,并计算出ntdll库的加载基址。

  泄漏出ntdll的地址之后,就要想办法做到任意代码执行了。与Linux环境下不同的是,这里没有的环境变量,无法直接泄漏出栈的地址。因此,想要得到任意代码执行的能力还必须劫持程序的控制流。这里提供一种可供参考的控制流劫持方式,修改属性。

  还是通过最开始的那个例子,这次我们仔细看看内存中分别存储了一些什么内容。

 24小时黑客在线接单qq(黑客接单平台) 当修改了的内容之后再添加属性(),能够劫持程序的控制流。

  这里在我们获得了任意地址读写的能力之后,一种有效的做法是伪造结构体,以及他的属性值。这里有的小伙伴可能会问了,为什么要伪造,而不是直接写。这是因为这个的地址是不可写的。图片

  具体要伪造的数据内容如图所示,一个TypedArrayClass结构体以及一个ClassOps的结构体。然后将原有的结构体中的数据复制到这个位置24小时黑客在线接单qq(黑客接单平台)当中,之后修改掉group当中存放的内容,以及shape指向的fake data当中存放的内容。构造的具体代码如下:

  现在我们有了控制RIP一次跳转的机会,但这还不够。还需想办法执行ROP或者最好能够直接执行shellcode。这就需要我们再做一次栈迁移,以便将执行流转到我们的ROP或者shellcode上。总结一下目前可以实现的功能:

  1.知道内存中对象存储在什么地址

  2.有办法控制程序的执行流

  3.有空间存储利用链,并且没有任何的限制

  为了弄清楚我们现在可以做一些什么,首先可以看一下在到达任意24小时黑客在线接单qq(黑客接单平台)代码执行时,寄存器的状态和内容。

  1.r8寄存器指向的内容是一个string类型的结构体,这个结构体中存储的字符串是我们新增的这个属性的字符串

  2.rdx中存储的是这个类型的Array,同样rbx寄存器当中也存储了这个Array结构体的地址

  3.r9当中存储的是我们要新增的属性的值,这里是

  但是当我在内存中查找的时候没有找到能够使用的靠谱gadgets,ggwp。我们需要尝试一些其他的方法才行。

  这里采用的方法是让引擎编译函数的时候创建出我们需要的gadgets,在内存中写入我们需要的gadget。对于下面的这个例子而言,在编译完成之后内存中会产生对应的汇编代码。

  因为这一段内存是可以执行的,所以这样一来,我们在内存中有了8个字节的shellcode可以使用。通过这些小段gadgets能够将栈迁移到我们想要的位置上。基本上我们需要的gadgets有下面两种:

  1.

  2.设置好调用函数的寄存器参数

  构造如下的函数:

  其中Magic是这个数字的double类型表示。通过在内存中搜索这个值找到JITed 24小时黑客在线接单qq(黑客接单平台) code的地址。这样我们就获得了我们想要的gadgets,虽然这些gadgets最长只有8个24小时黑客在线接单qq(黑客接单平台)字节,但是对于我们想要构造的内容已经完全足够了。接下来只需要将ropchain写到Target数组的buffer空间当中去即可。

  在ROP执行完毕之后就能够执行任意的shellcode了。

  *本文原创作者:Kriston,本文属FreeBuf原创奖励计划,未经许可禁止转载

标签:

本文来源:推文收录网

本文地址:https://www.hzccw.com/i/89826.html

版权声明:本站收录微信公众号文章内容全部来自于网络,部分内容为用户投稿内容,本站所有内容仅供个人学习、研究或者欣赏使用。版权归原作者所有。禁止一切商业用途。其中内容并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现本站上有侵犯您的知识产权的内容,请与我们联系,我们会及时修改或删除。