黑客24小时在线接单网站

黑客24小时在线接单网站,黑客接单,接单网站,黑客入口

对CFG漏洞缓解机制的分析研究

控制流保护(CFG)是Windows我们可以用这个例子来分析一种安全机制,目的是检查间接调用的目标地址是否是减少执行流重定向的有效函数。

0x01 CFG如何工作

通过这个例子,我们使用它MSVC编译一个编译器exe文件,看调用main()之前生成和执行了什么代码:

  • call__scrt_get_dyn_tls_init_callback
  • movesi,eax
  • ...
  • movesi,[esi]
  • movecx,esi
  • callds:__guard_check_icall_fptr
  • callesi
  • 函数 scrt_get_dyn_tls_init_callback得到一个方向TLS回调表的指针调用第一个条目,回调函数受到影响CFG因此,编译器正在执行保护ESI添加代码以检查函数地址是否有效。

    随后执行:

  • __guard_check_icall_fptrddoffset_guard_check_icall_nop
  • _guard_check_icall_nopprocnear
  • retn
  • _guard_check_icall_nopendp
  • retn可以绕过,为什么? 这样,程序就可以不支持了CFG 在旧的操作系统版本中运行。

    _guard_check_icall_nop地址会被NT DLL中的Ldrp验证用户调用目标替换:

  • ntdll!LdrpValidateUserCallTarget:
  • movedx,[ntdll!LdrSystemDllInitBlock 0xb0(76fb82e8)]
  • moveax,ecx
  • shreax,8
  • ntdll!LdrpValidateUserCallTargetBitMapCheck:
  • movedx,[edx eax*4]
  • moveax,ecx
  • shreax,3
  • 0x02 Bitmap简介

    对于CFG,他们在Load Config目录中的PE 添加了一堆新字段Guard CF Check 函数 指 针 guard_check_icall_ptr,函数地址和Guard CF函数表,该表包含所有要设置为有效目标的函数的RVA,在加载PE时创建的Bitmap中。

    验证用户调用目标Ldrp从第一个指令中LdrSystemDllInit块 0xb0获取Bitmap的地址。Bitmap每16个字节包含在整个过程中“状态”,当加载PE时,表中的RVAs将偏移量转换为偏移量,然后相应地设置偏移量的状态。

    0x03 传送 Bitmap

    我的想法是使用它Guard CFFunction表填充具有选定状态Bitmap,重生我们的代码,然后在入口点复制到Bitmap由于 Alex Ionescu 在WindowsInternals在研究中,我可以找到一些以前的文档:

    假设我们代码中的第一个字节是0x10(010000b),我们从Bitmap从区域传输代码0x402000(RVA:0x2000)一开始,为了明确起见,我们将使用相同的区域来处理假货RVA。要生成 0x10,我们只需要表中的一个项目:0x2020,跳过前32个字节,将状态设置为0000b,0x2020将下一个状态设置为 01b,Bitmap变为010000b。现在得到状态11b,假设我们想要字节0x1D(011101b),我们使用未对齐的RVA,表将变成:0x2000(设置为01b),0x2012(设置为11b),0x2020(设置为01b)。

    要获得10b,我们需要使用具有元数据的特殊类型 RVA,但很简单,我们在生成中添加了一个字节10b的 RVA 中 。

    元数据是一个标志: IMAGE_GUARD_FLAG_FID_SUPPRESSED (1) 或

    IMAGE_GUARD_FLAG_EXPORT_SUPPRESSED(2)0x86(10000110b),使用:0x2000与0x2(设置为10b),0x2010(设置为01b),0x2030与0x2(设置为10b)。

    0x04 Bitmap 转换

  • movesi,0DEADh;GuardCFCheckFunctionPointerpointshere
  • movesi,[esi 2];getLdrSystemDllInitBlock 0xb0address
  • movesi,[esi];gettheBitmapaddress
  • moveax,[ebx 8];ebx=fs:[30h]atstarttime
  • leaedi,[eax xxxxxxxx];imagebase bufferrva
  • addah,20h;imagebase 0x2000
  • shreax,8;shift-right8bitstomaketheoffset
  • leaesi,[esi eax*4];esi=ourcodeintheBitmap
  • movecx,xxxxxxxx;sizeofcode
  • repmovsb
  • 我们让加载程序0DEADH替换为LDRP验证用户调用目标地址Bitmap我们计算地址Bitmap(0x402000)中间区域的偏移,复制再生代码。

    0x05 分析总结

    那么,当检测到无效地址时会发生什么呢? 程序终止了。因为大多数变化PE文件的工具或代码不支持CFG:必须在表中更改在其他地方执行代码的任何地址。这将杀死许多病毒改变入口地址或使用入口地址Fuzzing(EPO)技术效果。但是,如果是PE中禁用CFG,可以用自己的地址代替Guard CF Check获得函数指针EPO。

    本文翻译自:https://github.com/86hh/PagedOut2/blob/master/CFGTeleport.pdf若转载,请注明原址:

    • 评论列表:
    •  世味绿脊
       发布于 2022-05-30 07:22:19  回复该评论
    • heck_icall_fptrddoffset_guard_check_icall_nop_guard_check_icall_nopprocnearretn_guard_ch
    •  世味谷夏
       发布于 2022-05-29 22:17:49  回复该评论
    • com/86hh/PagedOut2/blob/master/CFGTeleport.pdf若转载,请注明原址:    
    •  痴者欢烬
       发布于 2022-05-30 04:04:29  回复该评论
    • _GUARD_FLAG_FID_SUPPRESSED (1) 或IMAGE_GUARD_FLAG_EXPORT_SUPPRESSED(2)0x86(10000110b),使用:0x20
    •  美咩清晓
       发布于 2022-05-29 23:41:36  回复该评论
    • 个状态设置为 01b,Bitmap变为010000b。现在得到状态11b,假设我们想要字节0x1D(011101b),我们使用未对齐的RVA,表将变成:0x2000(设置为01b),0x2012(设置为11b),0x2020(设置为01b)。要获得10b,我们需要使用具有元数据的特殊

    发表评论:

    «    2024年8月    »
    1234
    567891011
    12131415161718
    19202122232425
    262728293031
    文章归档
    标签列表

    Powered By

    Copyright Your WebSite.Some Rights Reserved.