失去的东西虽然拿不回来,但是,忘记的事情是可以想起来的。 收藏本站
登陆 / 注册 搜索

阅读: 7.3K   回复: 3

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

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

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

http://cybersword.net/attack/exploit/558.html/ p0 H6 C% n, N/ x0 F$ s) }
3 n* m" N# m0 \$ a8 x( H/ R6 H
1..覆盖返回地址为jmp esp,执行shellcode,当函数返回,返回地址被覆盖为jmpesp,导致执行shellcode" ?' A; r  F* y# @7 V9 l
                    
/ |0 G; W) w8 e1 \* t      1)对付方法:引入Dep(data ExecutionPrevention 数据执行保护),堆,栈上的内存页属性为不可执行,执行会出错。2 j- M" }. M' ~1 D+ m
       2)Anti-Dep:绕过Dep技术ROP(return oriented programming),ROP由一系列的 Gadget组成。所谓ROP Gadget,就是一系列以retn结尾的指令。
6 G5 f# E" j+ H" ]; ^                           5 M" l; ^! Z* E% y3 x+ T
                1))为了使Gadget地址固定,无论什么时候指向的都是我们的命令,引入ASLR(address space layout randomization 地址空间格局随机化),ASLR,使得加载程    序时,不适用固定的加载基地址加载,该技术需要操作系统,和程序的双重支持,支持ASLR的程序会在pe头设置属性:
% Q5 P1 V/ {# o# l* q  U0 MIMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE标识表明其支持ASLR。
! A. m  l. X7 `, L2 q& T8 c       在VS中可选择:8 M( V! y' ~# p4 v7 l. _
                   2))ASLR所影响的部分有$ C0 v1 S4 L/ X1 X0 y2 r
$ o  ^: c$ ^, J5 A0 H% t
                         1)))模块随即化:OD打开进程-〉查看-〉可执行模块,基地址在系统重启的时候会变化 
6 q% @6 S6 c) }4 v                     2)))堆栈随即化,堆栈基地址会变化,进而导致内存中的变量会发生变化" r+ c  B# s4 G3 V, D$ U- `
                      3)))PEB/TEB随机化(不用固定的地址去获取PEB,TEB,用FS寄存器获取)
+ r* G% p0 q/ y7 l+ D  P                 3)) Anti-ASLR模块
: o( q$ I! N- `2 {  R) x                              1)))攻击未时启用的ASLR模块:虽然有映像随机化,但有可能有进程存在未启用ASLR,ROP技术要求从固定的地址获得Gadget,可使用OD的OLLYFindAddr插件查找进程 空间中未启用的ASLR模块
4 G: T1 z$ X. f2 \: r! V                              2)))堆喷射技术(HeapSpray技术):虽然堆栈随机化,但HeapSpray技术将ShellCode布局到0x0C0C0C0C(或者其他指定的地址上,通常这个地址要比较大),并不会受堆栈随机化的影响。 其实,HeapSpray中使用ROP绕过DEP的时候,就使用了前面提到的“攻击未启用ASLR的模块”。只是,HeapSpray把ShellCode布局在堆上。
- B9 Q1 g/ E) r' u  m- t. I3 f                             3)))覆盖部分返回地址:虽然模块加载基地址发生变化,但是各模块的入口点地址的低字节不变,只有高位变化, z  @; W# S2 i5 v* D' H  [
对于地址0×12345678,其中5678部分是固定的,如果存在缓冲区溢出,可以通过memcpy对后两个字节进行覆盖,可以将其设置为0×12340000 ~ 0x1234FFFF中的任意一个值。! I. M  O/ O. q# |  q& E/ Z# m
         如果通过strcpy进行覆盖,因为strcpy会复制末尾的结束符0×00,那么可以将0×12345678覆盖为0×12345600,或者0×12340001 ~ 0x123400FF。
/ F7 R! v- z8 b  g: o1 [         部分返回地址覆盖,可以使得覆盖后的地址相对于基地址的距离是固定的,可以从基地址附近找可以利用的跳转指令。" Q  H- u* ]" t4 K; i
         这种方法的通用性不是很强,因为覆盖返回地址时栈上的Cookie会被破坏。不过具体问题具体分析,为了绕过操作系统的安全保护机制需要考虑各种各样的情况。  {/ R# {9 b5 p2 z; b
                            4)))   java Applet Spray: java applet中动态申请的内存空间具有可执行属性,可在固定地址上分配滑板指令(如NOP)和shellcode,然后挑转到上面地址执行。和常规的HeapSpray不同,Applet申请空间的上限为100MB,而常规的HeapSpray可以达到1GB。
1 {3 l: g& o0 }0 N                             5)))   just in Time Compliation(JIT)即时编译,也就是解释器(如python解释器),主要思想是将ActionSCRIPT代码进行大量xor操作,然后编译成字节码,并且多次更新到FLASH VM 这样它会建立很多带有恶意XOR操作的内存块* C! J! d1 e  @( G
vary=(0×11223344^0×44332211^0×4433221);% g3 L; O: \5 e6 ]& f+ b
正常情况下被解释器解释为:: [% K; i6 Y7 [9 |
如果非常规的跳转到中间某一个字节开始执行代码,结果就是另一番景象了:% s* s* M2 g# A4 g: Z
         关于JIT的详细介绍,可以参考Pointer Inference and JIT Spraying以及Writing JIT-Spray shellcodefor fun and profit,文章末尾会给出链接。
) t% P( p( q& |! a5 Y) P" _8 tPointer Inference and JIT Spraying. y) }9 b; l$ C& b  l! w
Writing JIT-Spray shellcode for fun and profit (中文版)
. _5 s( p! g* @6 I8 t                         6.))) Tombkeeper在CanSecWest2013上提出的基于SharedUserData的方法
2 Z3 `; B: w! z & _! _" X$ Z9 ^( i& i
                                     1))))  从Windows NT 4到Windows 8,SharedUserData的位置一直固定在地址0x7ffe0000上。从WRK源代码中nti386.h以及ntamd64.h可以看出:
- U3 S1 Y1 e  k& t0 J' r. k* U- t                                                     #define MM_SHARED_USER_DATA_VA 0x7FFE0000! S1 b6 {2 z& s9 p6 M
                                                       在x86 Windows上,通过Windbg,可以看到:
$ y+ i# a$ I: z                                                       0:001> dt _KUSER_SHARED_DATASystemCall 0x7ffe0000+ b& V( f. z* C
                                                        ntdll!_KUSER_SHARED_DATA
; j1 B# J4 S  h& y3 C- d4 Y# i                                                       +0×300 SystemCall : 0x774364f0
, C% L+ A! K- v( o6 N( s # u+ H8 T$ Z' G
0x7ffe0300总是指向KiFastSystemCall+ G* d" p) l! M$ Z8 B4 `
0:001> uf poi(0x7ffe0300), N6 m7 H: b; y% S+ [7 d0 Q5 K
ntdll!KiFastSystemCall:$ Z- j; x9 i0 `1 m# F' }' M* p
774364f08bd4           mov     edx,esp
% {: l( x* E4 u% I! q: ~774364f2 0f34           sysenter
. T( {% `9 [+ n2 x2 b' B0 f- E774364f4 c3             ret/ s9 w: U+ ^: N7 [

" B$ g3 T  b- T                                  2))))    反汇编NtUserLockWorkStation函数,发现其就是通过7ffe0300进入内核的:( Y+ `. p# n$ {5 r, s3 O
0:001> ufUSER32!NtUserLockWorkStation
' e/ t0 o7 L* M  S. c) s* M" pUSER32!NtUserLockWorkStation:
" C/ {  @* V' r$ M7 g6 K75f70fadb8e6110000      mov     eax,11E6h- \) o9 w  U$ u' X8 A
75f70fb2 ba0003fe7f      mov    edx,offset SharedUserData!SystemCallStub (7ffe0300)
2 I3 |3 i1 i7 L75f70fb7 ff12           call   dword ptr [edx]% K) E" b1 p4 m' T
75f70fb9 c3             ret
- a7 z' S$ D- X$ u6 x* X; H' Z         其中11E6是NtUserLockWorkStation的服务号(ShadowSSDT中0x01E6的服务),通过Xuetr可以看到:) Z5 |+ @. D8 K7 n) l/ s6 V$ C
         这样,在触发漏洞前合理布局寄存器内容,用函数在系统服务(SSDT / Shadow SSDT)中服务号填充EAX寄存器,然后让EIP跳转到对应的地方去执行,就可以调用指定的函数了。但是也存在很大的局限性:仅仅工作于x86 Windows上;几乎无法调用有参数的函数。
4 i. m9 h. J1 R9 j, M         r3 G2 D7 t, U

( r* Q( I; x+ n8 d  64位Windows系统上0x7ffe0350总是指向函数ntdll!LdrHotPatchRoutine。
+ l: s5 Z; f6 M9 ^HotPatchBuffer结构体的定义如下:9 Q+ k* e0 ~0 D+ I) H3 B
struct HotPatchBuffer {" P" p3 d% ~5 _( i) F7 d
ULONG   NotSoSure01; //& 0×20000000  != 0
4 u  |5 W$ g  L6 C: NULONG   NotSoSure02;
. u1 \" m" V& t4 I/ }USHORT  PatcherNameOffset;  // 结构体相对偏移地址
& T9 |& e  ?! v: `- BUSHORT  PatcherNameLen;
- i+ p% R9 Y+ N: S, F% J' m5 OUSHORT  PatcheeNameOffset;  c0 O1 ~6 D7 z2 V4 F6 o
USHORT  PatcheeNameLen;8 H( \+ @; Z. t
USHORT  UnknownNameOffset;# x9 u$ y" q1 q+ |1 [
USHORT  UnknownNameLen
6 M4 c' M. ?/ O/ v};0 Y' v; }1 J& A9 K
LdrHotPatchRoutine调用方式:
; S! c! i* ?( p9 X: }# ~1 w6 H! `void LdrHotPatchRoutine (struct *HotPatchBuffer);" y: }1 F5 v2 q  n$ [: D2 @8 s- V
         在触发漏洞前合理布局寄存器内容,合理填充HotPatchBuffer 结构体的内容,然后调用LdrHotPatchRoutine。
: A: b1 c$ I/ d/ y         如果是网页挂马,可以指定从远程地址加载一个DLL文件;
6 m& k  P# N( a% V         如果已经经过其他方法把DLL打包发送给受害者,执行本地加载DLL即可。
; p- V, _9 t5 b9 k0 a1 f7 N4 i8 {1 E$ g         此方法通常需要HeapSpray协助布局内存数据;且需要文件共享服务器存放恶意DLL;只工作于64位系统上的32位应用程序;不适用于Windows 8(已经被修补)。
上一篇
下一篇


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

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

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

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

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

本版积分规则

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

GMT+8, 2021-4-11 09:03 , Processed in 0.027993 second(s), 19 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表