CVE-2016-9899 分析与利用

UAF

元素创建 分配了多大内存, 一般静态分析(用于后面的占位)
元素释放
重用

  1. 一般来说 开启hpa ust能够追踪到异常 内存的创建,释放 重用 过程
  2. 直接断点 所有创建 的元素 与 后面重用的元素对象的地址 来判断 是那个对象 的UAF

crash info

1
2
3
4
5
6
7
8
9
10
11
12
13
0:000:x86> r
eax=13768c00 ebx=00000000 ecx=0018de68 edx=4543484f esi=0018de84 edi=110d2e80
eip=02bfc44c esp=0018de58 ebp=0018de6c iopl=0 nv up ei pl nz na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00210206
xul!nsCOMPtr<nsIContent>::nsCOMPtr<nsIContent>+0x1d:
02bfc44c ff12 call dword ptr [edx] ds:002b:4543484f=????????
0:000:x86> kb
ChildEBP RetAddr Args to Child
0018de6c 0318df89 13768c00 00000003 0018dea8 xul!nsCOMPtr<nsIContent>::nsCOMPtr<nsIContent>+0x1d [c:\builds\moz2_slave\m-rel-w32-00000000000000000000\build\src\obj-firefox\dist\include\nscomptr.h @ 504]
0018de7c 02d2fa21 00000000 00000000 0ed14400 xul!nsPluginFrame::BeginSwapDocShells+0xf [c:\builds\moz2_slave\m-rel-w32-00000000000000000000\build\src\layout\generic\nspluginframe.cpp @ 1796]
0018dea8 02dcf404 0318df7a 00000000 110d2760 xul!nsIDocument::EnumerateActivityObservers+0x33 [c:\builds\moz2_slave\m-rel-w32-00000000000000000000\build\src\dom\base\nsdocument.cpp @ 10246]
0018dec4 02dcf3a6 11402800 00000000 110e0058 xul!BeginSwapDocShellsForDocument+0x42 [c:\builds\moz2_slave\m-rel-w32-00000000000000000000\build\src\layout\generic\nssubdocumentframe.cpp @ 1100]
0018dedc 02dcf2ab 110dfd90 110e01a8 110e0058 xul!BeginSwapDocShellsForViews+0x1e [c:\builds\moz2_slave\m-rel-w32-00000000000000000000\build\src\layout\generic\nssubdocumentframe.cpp @ 1112]

1
2
3
4
5
6
7
8
/*static*/ void
nsPluginFrame::BeginSwapDocShells(nsISupports* aSupports, void*)
{
NS_PRECONDITION(aSupports, "");
nsCOMPtr<nsIContent> content(do_QueryInterface(aSupports)); //在这里调用 构造函数
if (!content) {
return;
}

create

https://github.com/jostw/gecko

确定元素创建的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
0:000:x86> x xul!*document*createElement*
04d17284 xul!mozilla::dom::DocumentBinding::createElementNS_methodinfo = struct JSJitInfo
04d16cd8 xul!mozilla::dom::DocumentBinding::createElement_methodinfo = struct JSJitInfo
02cf93f8 xul!mozilla::dom::XULDocument::CreateElementFromPrototype (void)
0409cc55 xul!mozilla::dom::XULDocument::CreateElement (void)
0409cc55 xul!nsHTMLDocument::CreateElement (void)
02e3891e xul!mozilla::dom::DocumentBinding::createElementNS (void)
039aebb5 xul!nsDocument::CreateElement (void)
030ac339 xul!nsDocument::CreateElement (void)
030ac1ff xul!mozilla::dom::DocumentBinding::createElement (void)
03e25609 xul!mozilla::dom::XULDocument::CreateElementNS (void)
03e25609 xul!nsHTMLDocument::CreateElementNS (void)
039aec70 xul!nsDocument::CreateElementNS (void)
02e38bf5 xul!nsDocument::CreateElementNS (void)
03265ce4 xul!mozilla::dom::XULDocument::CreateElement = <no type information>
03260950 xul!nsHTMLDocument::CreateElement = <no type information>
0326095d xul!nsHTMLDocument::CreateElementNS = <no type information>
03265cf1 xul!mozilla::dom::XULDocument::CreateElementNS = <no type information>

核心函数
ur继续查看反汇编代码
uf查看整个函数反汇编代码
ub以该地址为结束地址
第一个
1
nsCOMPtr<Element> element = CreateElement(aTagName, options, rv);

第二个
1
2
RefPtr<Element> elem = CreateElem(
needsLowercase ? lcTagName : aTagName, nullptr, mDefaultElementType, is);

找到对应汇编函数偏移 设置断点
确定为 第二个 地址偏小的一个
1
2
3
0:000:x86> bl
0 e x86 039aec0e 0001 (0001) 0:**** xul!nsDocument::CreateElement+0x59 "dps poi(eax); .echo '----------'; gc"
1 e x86 030ac415 0001 (0001) 0:**** xul!nsDocument::CreateElement+0xdc "dps poi(eax); .echo '----------'; gc"

运行后拿到信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'----------'
13768c00 0506b070 xul!mozilla::dom::HTMLAudioElement::`vftable'
13768c04 050975d8 xul!mozilla::dom::HTMLAudioElement::`vftable'
13768c08 00000000
13768c0c 00100000
13768c10 1010ea10
13768c14 00000000
13768c18 00020008 VCRUNTIME140!__ImageBase+0x8
13768c1c 00000000
13768c20 00000000
13768c24 00000000
13768c28 13768c00
13768c2c 00000000
13768c30 00000005
13768c34 00000000
13768c38 00020000 VCRUNTIME140!__ImageBase
13768c3c 00000400
13768c40 0506c05c xul!mozilla::dom::HTMLAudioElement::`vftable'

1
2
3
4
5
6
0:000:x86> r
eax=13768c00 ebx=00000000 ecx=0018de68 edx=4543484f esi=0018de84 edi=110d2e80
eip=02bfc44c esp=0018de58 ebp=0018de6c iopl=0 nv up ei pl nz na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00210206
xul!nsCOMPtr<nsIContent>::nsCOMPtr<nsIContent>+0x1d:
02bfc44c ff12 call dword ptr [edx] ds:002b:4543484f=????????

对比一下可知 前面申请的地址是 13768c00,后面重使用的是eax=13768c00,因此应该是HTMLAudioElement对象释放后重用

继续跟到blbl

利用

浏览器UAF基本利用方法是,在释放之后申请一块相同大小的内存占位,从而在重用时控制EIP,然后可以通过堆喷射绕过ASLR,使用ROP绕过DEP。

占位

堆喷射

ROP

CVE-2017-7269 IIS6.0 WebDAV 溢出分析 VUzzer
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×