c++ encode 函数_指针加密解密 函数RtlDecodePointer 与RtlEncodePointer

我们知道在我们对溢出漏洞进行exp的时候,经常要利用全局性的指针,利用异常处理。那么XP的sp2对此作了处理。使得我们无法运用以前的技巧来完成我们的工作。例如,对全局性的指针都作了编码处理。

那么具体来讲,本文主要谈到以下

1、映射给PEB管理结构的起始地址做了随机处理。后面我们会看到这种随机是很弱的,但已经足够让exp无法完成或者说是稳定的工作。

2、对TOP SEH的保护

3、VEH链表指针_RtlpCalloutEntryList的保护

4、堆块结构的cookie保护

不涉及内容:

1、如何绕过保护机制

2、堆管理的细节,其实没有太大的变化

主题开始:

1、PEB的地址的随机

xp系统下,创建进程使用的是_NtCreateProcessEx函数,而不是_NtCreateProcess函数。_NtCreateProcessEx主要调用_PspCreateProcess@36函数来完成进程的创建工作

PAGE:004B4649                 call    _PspCreateProcess@36 ; PspCreateProcess(x,x,x,x,x,x,x,x,x)

进程的创建主要包括设置EPROCESS,创建初始进程地址空间等。这里就不罗嗦了。PEB的设置通过调用_MmCreatePeb.

PAGE:004B428E                 push    eax

PAGE:004B428F                 push    ebx

PAGE:004B4290                 push    dword ptr [ebp-60h]

PAGE:004B4293                 call    _MmCreateProcessAddressSpace@12 ; MmCreateProcessAddressSpace(x,x,x)

PAGE:004B43E5                 lea     eax, [ebx+1B0h]

PAGE:004B43EB                 push    eax

PAGE:004B43EC                 lea     eax, [ebp-40h]

PAGE:004B43EF                 push    eax

PAGE:004B43F0                 push    ebx

PAGE:004B43F1                 call    _MmCreatePeb@12 ; MmCreatePeb(x,x,x)

而MmCreatePeb又主要通过调用_MiCreatePebOrTeb

PAGE:004B4A61 ; __stdcall MmCreatePeb(x,x,x)

PAGE:004B4A61 _MmCreatePeb@12 proc near               ; CODE XREF: PspCreateProcess(x,x,x,x,x,x,x,x,x)+303 p

PAGE:004B4A61

PAGE:004B4A61 ; FUNCTION CHUNK AT PAGE:005267FF SIZE 000000DC BYTES

PAGE:004B4A61

PAGE:004B4A61                 push    3Ch

PAGE:004B4A63                 push    offset dword_42DAA8

PAGE:004B4A68                 call    __SEH_prolog

PAGE:004B4A6D                 xor     ebx, ebx

PAGE:004B4A6F                 mov     [ebp-20h], ebx

PAGE:004B4A72                 mov     [ebp-4Ch], ebx

PAGE:004B4A75                 mov     [ebp-48h], ebx

PAGE:004B4A78                 mov     [ebp-2Ch], ebx

PAGE:004B4A7B                 mov     esi, [ebp+8]

PAGE:004B4A7E                 push    esi

PAGE:004B4A7F                 call    _KeAttachProcess@4 ; KeAttachProcess(x)

PAGE:004B4A84                 push    2

PAGE:004B4A86                 pop     edi

PAGE:004B4A87                 push    edi

PAGE:004B4A88                 push    (offset loc_4FFFFE+2)

PAGE:004B4A8D                 push    1

PAGE:004B4A8F                 lea     eax, [ebp-2Ch]

PAGE:004B4A92                 push    eax

PAGE:004B4A93                 lea     eax, [ebp-4Ch]

PAGE:004B4A96                 push    eax

PAGE:004B4A97                 push    ebx

PAGE:004B4A98                 push    ebx

PAGE:004B4A99                 lea     eax, [ebp-20h]

PAGE:004B4A9C                 push    eax

PAGE:004B4A9D                 push    esi

PAGE:004B4A9E                 push    ds:_InitNlsSectionPointer

PAGE:004B4AA4                 call    _MmMapViewOfSection@40 ; MmMapViewOfSection(x,x,x,x,x,x,x,x,x,x)

PAGE:004B4AA9                 mov     [ebp-24h], eax

PAGE:004B4AAC                 cmp     eax, ebx

PAGE:004B4AAE                 jl      loc_5267FF

PAGE:004B4AB4                 lea     eax, [ebp-1Ch]

注意下面这个210参数,类似一个Flag。在后面你会发现,如果该参数不等于210,那么映射的PEB地址将不会产生随机值,而是会跟以前的一样,始终在7FFDF000位置。

PAGE:004B4AB7                 push    eax

PAGE:004B4AB8                 push    210h

;注意这个参数!

PAGE:004B4ABD                 push    esi

PAGE:004B4ABE                 call    _MiCreatePebOrTeb@12 ; MiCreatePebOrTeb(x,x,x)

真正完成工作

_MiCreatePebOrTeb@12 函数

PAGE:004B01AE                 call    _ExAllocatePoolWithTag@12 ; ExAllocatePoolWithTag(x,x,x)

PAGE:004B01B3                 mov     esi, eax

PAGE:004B01B5                 test    esi, esi

PAGE:004B01B7                 jz      loc_52678E

PAGE:004B01BD                 mov     eax, [ebp+arg_8]

PAGE:004B01C0                 mov     ecx, [ebp+arg_8]

PAGE:004B01C3                 and     eax, 0FFFh

PAGE:004B01C8                 neg     eax

PAGE:004B01CA                 sbb     eax, eax

PAGE:004B01CC                 neg     eax

PAGE:004B01CE                 shr     ecx, 0Ch

PAGE:004B01FB                 cmp     [ebp+arg_8], 210h

PAGE:004B0202                 jz      loc_4B4A0A

;这里将210与压栈的参数比较,如果压入栈的不是210呢

PAGE:004B0208 loc_4B0208:                             ; CODE XREF: MiCreatePebOrTeb(x,x,x)+48AD

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值