UAF
元素创建 分配了多大内存, 一般静态分析(用于后面的占位)
元素释放
重用
- 一般来说 开启hpa ust能够追踪到异常 内存的创建,释放 重用 过程
- 直接断点 所有创建 的元素 与 后面重用的元素对象的地址 来判断 是那个对象 的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
| 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