前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[ Windows 10 x64中的RFG(Return Flow Guard)技术研究 ]

[ Windows 10 x64中的RFG(Return Flow Guard)技术研究 ]

作者头像
franket
发布2022-06-29 16:44:43
4980
发布2022-06-29 16:44:43
举报
文章被收录于专栏:技术杂记
代码语言:javascript
复制
[目录]
[0x01].背景介绍
[0x02].防护层面分析
[0x02.1].用户层面fs
[0x02.2].内核层面fs
[0x02.3].“影子栈”的内存布局 
[0x03].突破RFG的可能性
[0x04].致谢
                                  

[0x01] 背景介绍

    RFG(Return Flow Guard)是在最近的windows10x64里面加入的最新的防护措施。用来防止对栈上返回地址的篡改。
不同于/GS策略,RFG是由编译器和操作系统共同来支持的特性,防御强度远远高于/GS方式。在这里微软首次引入Thread Controlstack
概念(也可以称之为影子堆栈)完成了对篡改返回地址的这种长久以来的攻击方式的的强力反击。

   首先,在(Insider Preview 14986版本中)RFG技术在编译器的支持下将原有的函数中加入的额外的检测代码,在程序实际运行时进行检测。
这一点类似于CFG功能.我们可以任意选择一个PE文件,可以看到,在一个函数的开头的2条指令仅起到占位的效果,程序运行后会被动态的填充。
例如,Edge中MicrosoftEdgeCP模块中的一个RegisterWinRTObject函数在IDA中分析一下: 

可以看到加星号部分代表需要动态修正的部分内容。

.text:00000001400026C0 ; public: virtual long Microsoft::WRL::Module<1, class 
Platform::Details::InProcModule>::RegisterWinRTObject(wchar_t const *, wchar_t const * *,
 struct _unnamed_type_RO_REGISTRATION_COOKIE_ * *, unsigned int)

.text:00000001400026C0                 xchg    ax, ax  <******<   
.text:00000001400026C2                 nop     dword ptr [rax+00000000h] <******< 
.text:00000001400026C9                 sub     rsp, 28h
.text:00000001400026CD                 xor     edx, edx
.text:00000001400026CF                 mov     ecx, 80004001h
.text:00000001400026D4                 call    RoOriginateError_0
.text:00000001400026D9                 mov     eax, 80004001h
.text:00000001400026DE                 add     rsp, 28h
.text:00000001400026E2                 retn
.text:00000001400026E2 ; ---------------------------------------------------------------------------
.text:00000001400026E3                 db 0Eh dup(90h)  <******<      
.text:00000001400026F1 ; ---------------------------------------------------------------------------
.text:00000001400026F1                 retn

在Edge运行起来后,函数开头和结尾被动态的填入如下代码星号部分

MicrosoftEdgeCP!Microsoft::WRL::Module<1,Platform::Details::InProcModule>::RegisterCOMObject:
00007ff7`58e526c0 488b0424        mov     rax,qword ptr [rsp]    <******< 
00007ff7`58e526c4 6448890424      mov     qword ptr fs:[rsp],rax <******<
00007ff7`58e526c9 4883ec28        sub     rsp,28h
00007ff7`58e526cd 33d2            xor     edx,edx
00007ff7`58e526cf b901400080      mov     ecx,80004001h
00007ff7`58e526d4 e8ddfbffff      call    MicrosoftEdgeCP!RoOriginateError (00007ff7`58e522b6)
00007ff7`58e526d9 b801400080      mov     eax,80004001h
00007ff7`58e526de 4883c428        add     rsp,28h
00007ff7`58e526e2 644c8b1c24      mov     r11,qword ptr fs:[rsp]  <******<
00007ff7`58e526e7 4c3b1c24        cmp     r11,qword ptr [rsp]     <******<
00007ff7`58e526eb 0f85ef350100    jne     MicrosoftEdgeCP!_guard_ss_verify_failure (00007ff7`58e65ce0) <******<
00007ff7`58e526f1  c3             ret  

//RFG校验失败运行到这里
MicrosoftEdgeCP!_guard_ss_verify_failure!_guard_ss_verify_failure:
00007ffb`c52b0580 4d33db          xor     r11,r11
00007ffb`c52b0583 ff25e7f33800    jmp     qword ptr [chakra!_guard_ss_verify_failure_fptr (00007ffb`c563f970)]
00007ffb`c52b0589 cc              int     3

//RFG校验失败运行到这里
ntdll!LdrpHandleInvalidReturnAddress:
00007ffb`e754e8c0 498bc3          mov     rax,r11
00007ffb`e754e8c3 4883e007        and     rax,7
00007ffb`e754e8c7 85c0            test    eax,eax
00007ffb`e754e8c9 7511            jne     ntdll!LdrpHandleInvalidReturnAddress+0x1c (00007ffb`e754e8dc) [br=0]
00007ffb`e754e8cb 488b1424        mov     rdx,qword ptr [rsp]
00007ffb`e754e8cf 644c8b0424      mov     r8,qword ptr fs:[rsp]
00007ffb`e754e8d4 b92c000000      mov     ecx,2Ch
00007ffb`e754e8d9 cd29            int     29h
00007ffb`e754e8db 90              nop

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档