-
-
[原创]XP SP3, IE8, JavaScript 堆喷射经验值的修正及修正思路
-
发表于:
2017-8-23 12:23
8430
-
[原创]XP SP3, IE8, JavaScript 堆喷射经验值的修正及修正思路
在15PB参加培训刚毕业,
之前上课过程中发现一直广泛使用的一个经验值有问题
现在正好有时间,整理一下发出来
环境:WindowsXP SP3,IE8
利用漏洞: 暴雷漏洞 CVE-2012-1889 ( 同学的分析报告在这里 [2])
整体思路:确保每一段填入的数据连续、有效
结论: XP SP3, IE8 下经验值应该改为 block = shellcode.substring(2, 0x40000 - 0x809)
结果:修正前512M内存下失败概率接近1/2,调整后为1/5 到1/10; 1G内存下失败率很低,未统计。
代码见附件。
下面开始上主菜:修正过程及修正思路
每当提到IE堆喷射的时候总会提到一套前辈们的经验值,具体出处,还没有找到。
像这里[3]
(图1:前辈们的经验值)
还有这里[4]:
(图2:前辈们的经验值)
等等。
当然,我们课上提到的也是同一套经验值。
1. 但是在 WindowsXP SP3,IE8 环境下经常会有很大的概率遇到如下错误
(图3:报错信息)
2. 用 windbg 查看报错原因:
(图4:windbg观察错误区域信息)
发现 0X0C0C0C0C 处并不是我们理想中的 shellcode ,而是填充的“00”
3. 接着网下看,会发现 0X0C0C0C0C 之后是一段不可访问的内存,从 0x0C0C1000 开始
(图5:windbg观察错误区域信息)
4. 那我们的 shellcode 去哪儿了呢,于是接着往下看发现 0x0C0C0C0C + 0x10000又有数据了
(图6:windbg观察堆的结构)
5. 看看这段连续数据有多长,于是在0x0C0C0C0C - 0x90000 位置又是一段,而且每隔 0x90000 就会有一段 00
(图6:windbg观察堆的结构)
6. 接着往下看会发现,同样每隔0x90000 就会出现一段 00 填充的内存
7. 可以看出堆中一个单位块的结构:后两段正好0x10000
数据(大小 0x80000)
00(大小 0x1000)
???(0x10000-0x1000)
一个单位块的大小正好是 0x90000
猜测 1:代码中cBlock块 (Unicode)长度正好是 0x40000 大小正好是0x80000,两者之间会不会有关系
验证猜测:把代码中的cBlock 大小改成 0x50000,于是内存分布变成这样:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)