美好的人眼裡映出的世界也是美好的。 收藏本站
登陆 / 注册 搜索

阅读: 6.9K   回复: 3

[# 系统基础] ASLR/DEP绕过技术概览(学习)(转)

soarcloud 「龙战于野」 2016-7-15 21:36 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

http://cybersword.net/attack/exploit/558.html
; ]6 Z+ b, y4 h$ }) G) k' ~
7 T  ^* ^% k' b1..覆盖返回地址为jmp esp,执行shellcode,当函数返回,返回地址被覆盖为jmpesp,导致执行shellcode
9 B/ C) U5 R, M& p1 ?                    
, M3 v. l8 A1 t9 @      1)对付方法:引入Dep(data ExecutionPrevention 数据执行保护),堆,栈上的内存页属性为不可执行,执行会出错。1 T3 U  t" i/ e  K1 N/ c% X' ]3 _
       2)Anti-Dep:绕过Dep技术ROP(return oriented programming),ROP由一系列的 Gadget组成。所谓ROP Gadget,就是一系列以retn结尾的指令。
, w9 B$ g2 v0 X: X, w7 l1 |                           
, r8 ]9 C8 j" z8 B/ x8 `                1))为了使Gadget地址固定,无论什么时候指向的都是我们的命令,引入ASLR(address space layout randomization 地址空间格局随机化),ASLR,使得加载程    序时,不适用固定的加载基地址加载,该技术需要操作系统,和程序的双重支持,支持ASLR的程序会在pe头设置属性:
8 Y2 k$ G: P3 M+ cIMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE标识表明其支持ASLR。
8 _( j% x  E; m1 @4 {+ ~% \. ?' ?6 B' ]       在VS中可选择:: z. ]0 v* r9 e7 h: Z
                   2))ASLR所影响的部分有
+ H+ j! ~5 s4 l4 _4 K2 [ 3 o; g  \  n) c9 `( ^
                         1)))模块随即化:OD打开进程-〉查看-〉可执行模块,基地址在系统重启的时候会变化 7 I5 I$ T( _& J: _/ _& E
                     2)))堆栈随即化,堆栈基地址会变化,进而导致内存中的变量会发生变化3 c7 @% X' s( g, [7 k+ D
                      3)))PEB/TEB随机化(不用固定的地址去获取PEB,TEB,用FS寄存器获取)
& e; I" J+ R7 c                 3)) Anti-ASLR模块  ]9 B: W) r. f* B7 \
                              1)))攻击未时启用的ASLR模块:虽然有映像随机化,但有可能有进程存在未启用ASLR,ROP技术要求从固定的地址获得Gadget,可使用OD的OLLYFindAddr插件查找进程 空间中未启用的ASLR模块
& N0 m5 ]; `, Z9 A7 [( Q2 b2 E                              2)))堆喷射技术(HeapSpray技术):虽然堆栈随机化,但HeapSpray技术将ShellCode布局到0x0C0C0C0C(或者其他指定的地址上,通常这个地址要比较大),并不会受堆栈随机化的影响。 其实,HeapSpray中使用ROP绕过DEP的时候,就使用了前面提到的“攻击未启用ASLR的模块”。只是,HeapSpray把ShellCode布局在堆上。
+ r9 r. ]" \! B9 |: x' R7 I                             3)))覆盖部分返回地址:虽然模块加载基地址发生变化,但是各模块的入口点地址的低字节不变,只有高位变化! k2 c' A9 J: M# }& [: _
对于地址0×12345678,其中5678部分是固定的,如果存在缓冲区溢出,可以通过memcpy对后两个字节进行覆盖,可以将其设置为0×12340000 ~ 0x1234FFFF中的任意一个值。2 X  |' |! O! G& m* ?( d, K, F& E
         如果通过strcpy进行覆盖,因为strcpy会复制末尾的结束符0×00,那么可以将0×12345678覆盖为0×12345600,或者0×12340001 ~ 0x123400FF。
; Y/ e0 F0 r' X- ]9 S         部分返回地址覆盖,可以使得覆盖后的地址相对于基地址的距离是固定的,可以从基地址附近找可以利用的跳转指令。
) U5 E1 Z; O7 ~+ P- z' v) o         这种方法的通用性不是很强,因为覆盖返回地址时栈上的Cookie会被破坏。不过具体问题具体分析,为了绕过操作系统的安全保护机制需要考虑各种各样的情况。# H% C* U5 J8 q8 ~3 Q# U3 X: ?
                            4)))   java Applet Spray: java applet中动态申请的内存空间具有可执行属性,可在固定地址上分配滑板指令(如NOP)和shellcode,然后挑转到上面地址执行。和常规的HeapSpray不同,Applet申请空间的上限为100MB,而常规的HeapSpray可以达到1GB。
& \3 E$ }- l  B2 r                             5)))   just in Time Compliation(JIT)即时编译,也就是解释器(如python解释器),主要思想是将ActionSCRIPT代码进行大量xor操作,然后编译成字节码,并且多次更新到FLASH VM 这样它会建立很多带有恶意XOR操作的内存块
$ J7 J% G/ ~6 ]. Q+ s/ ]vary=(0×11223344^0×44332211^0×4433221);0 O2 n) D9 \4 U  t; q
正常情况下被解释器解释为:
4 w  v0 Y2 Y1 C6 j7 z. a% V如果非常规的跳转到中间某一个字节开始执行代码,结果就是另一番景象了:. r4 V; V* V) J
         关于JIT的详细介绍,可以参考Pointer Inference and JIT Spraying以及Writing JIT-Spray shellcodefor fun and profit,文章末尾会给出链接。
" f! A1 g( r2 @7 ]Pointer Inference and JIT Spraying
1 K: f, N+ j/ |Writing JIT-Spray shellcode for fun and profit (中文版)1 a/ n6 I: `; z; h' m$ \; u: l
                         6.))) Tombkeeper在CanSecWest2013上提出的基于SharedUserData的方法
: g3 j/ K7 Y% m/ \
! b. }" j" ?6 A. w4 R& X                                     1))))  从Windows NT 4到Windows 8,SharedUserData的位置一直固定在地址0x7ffe0000上。从WRK源代码中nti386.h以及ntamd64.h可以看出:
; M& U" F1 r# j                                                     #define MM_SHARED_USER_DATA_VA 0x7FFE0000
& e8 R4 A9 y, o                                                       在x86 Windows上,通过Windbg,可以看到:
9 G0 |# R) n% W& ^2 g. ?9 p' V                                                       0:001> dt _KUSER_SHARED_DATASystemCall 0x7ffe0000: L( g1 [3 p0 x: q9 K5 H% Y# N
                                                        ntdll!_KUSER_SHARED_DATA
$ X: Q, c. ]. a# t) f2 h2 q                                                       +0×300 SystemCall : 0x774364f0
4 n1 ]& y8 N& W
' b- o. f& Y0 W1 H0x7ffe0300总是指向KiFastSystemCall
$ @7 a# n9 h) K; W& D8 B0:001> uf poi(0x7ffe0300)
1 V6 Y; Z2 u/ k: x) Sntdll!KiFastSystemCall:2 E0 b$ h0 f2 n  M' a; Z6 T
774364f08bd4           mov     edx,esp! g# ^+ k3 |( ~
774364f2 0f34           sysenter6 U$ x9 m  k3 F' x( u$ G: _
774364f4 c3             ret
& y! y1 \8 c* L
5 m, }6 e0 u3 d8 L+ J                                  2))))    反汇编NtUserLockWorkStation函数,发现其就是通过7ffe0300进入内核的:
; G, W! N" N3 q1 r( F$ I0:001> ufUSER32!NtUserLockWorkStation8 u: X& |" q# q% j: v2 v
USER32!NtUserLockWorkStation:* w; |& ?- m# O
75f70fadb8e6110000      mov     eax,11E6h! X, o/ n+ t( g7 Z
75f70fb2 ba0003fe7f      mov    edx,offset SharedUserData!SystemCallStub (7ffe0300)
+ M8 L( X- ]' w4 L# [$ q3 o- `5 V' Q/ ?75f70fb7 ff12           call   dword ptr [edx]+ g0 `: N3 b* e/ d8 V6 `! K
75f70fb9 c3             ret
3 A. P% B/ o, k  W  H6 S         其中11E6是NtUserLockWorkStation的服务号(ShadowSSDT中0x01E6的服务),通过Xuetr可以看到:
- Q1 F6 ^9 ?' ?) t+ r" g         这样,在触发漏洞前合理布局寄存器内容,用函数在系统服务(SSDT / Shadow SSDT)中服务号填充EAX寄存器,然后让EIP跳转到对应的地方去执行,就可以调用指定的函数了。但是也存在很大的局限性:仅仅工作于x86 Windows上;几乎无法调用有参数的函数。& q, f$ D, m! B7 u; x
      
, ?1 s4 L; [1 `- L: f6 Y- T
) j* `4 ~% U  _& U: H  64位Windows系统上0x7ffe0350总是指向函数ntdll!LdrHotPatchRoutine。& |1 p: z0 i6 ]0 `& Z" o$ e
HotPatchBuffer结构体的定义如下:3 l; Z& _* P3 E+ n) M; y
struct HotPatchBuffer {" T6 |# @, o: x- M6 C, G: e
ULONG   NotSoSure01; //& 0×20000000  != 0
1 E1 a0 W# t' q4 O) Z! i) @( iULONG   NotSoSure02;
8 ~/ }3 j2 P& UUSHORT  PatcherNameOffset;  // 结构体相对偏移地址" W. z5 O/ e/ x7 R
USHORT  PatcherNameLen;
0 b  `4 F; Y% ~4 I  O2 H/ }$ gUSHORT  PatcheeNameOffset;( |- |4 P, H" w3 m) }
USHORT  PatcheeNameLen;: H* u9 Z4 F% g
USHORT  UnknownNameOffset;0 }: H) F, e1 i5 Y/ o! P5 N
USHORT  UnknownNameLen; X, r; Q. U$ e$ K
};
: b, w: h0 t1 c5 C  GLdrHotPatchRoutine调用方式:
0 h8 r: h' r" ~" ^void LdrHotPatchRoutine (struct *HotPatchBuffer);
7 @) x" v- S2 b6 |) j         在触发漏洞前合理布局寄存器内容,合理填充HotPatchBuffer 结构体的内容,然后调用LdrHotPatchRoutine。
# G& \, \' y% W# J         如果是网页挂马,可以指定从远程地址加载一个DLL文件;
# }0 H" f* h9 i) k         如果已经经过其他方法把DLL打包发送给受害者,执行本地加载DLL即可。: ^% V& R3 j8 V4 U% T$ j
         此方法通常需要HeapSpray协助布局内存数据;且需要文件共享服务器存放恶意DLL;只工作于64位系统上的32位应用程序;不适用于Windows 8(已经被修补)。


雾月 「出类拔萃」 2018-5-4 18:20 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

为毛老子总也抢不到沙发?!!
初晓微芒 「出类拔萃」 2018-5-5 14:56 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

此贴构思巧妙,视角独到,手法新颖。字字斟酌,句句精美,情节曲折,而又始终不离中心思想,引人入胜,淡淡的言语中,显示人生之大道理,充分体现了您深厚的文化底韵与丰富的社会经验,真可谓讽刺之经典,骂人之绝学,这正是我辈苦学闷读追求的至高境界啊!
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

关于本站|大事记|小黑屋|古黑论 网站统计

GMT+8, 2020-10-29 15:38 , Processed in 0.041698 second(s), 21 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表