欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

SEH浮想联翩(应用)

SEH浮想联翩(应用)

谈过理论,下面是应用。
二. SEH在virus中的应用
   SEH能让我们的asm代码更健壮,xfish的系列文章已经有描述了。直接看:
  http://bbs.pediy.com/showthread.php?t=86452
   同时可以用SEH去做免杀,对抗模拟器。
   前提假设是模拟器没法模拟异常。思路如下:
   call seh
   seh_handler:
      mov eax,[esp+0xc] 
  mov cl,0xb8
  add dword [eax+ecx],5     ;跳过jmp语句,到virus处执行
  xor eax,eax
  ret
  seh:
  push fs:[0]
  mov fs:[0],esp
  @except:
  xor eax,eax
  mov [eax],0   
  jmp @except 
  virus:
  .......
  
 此处需要注意两点:
   a. 由于seh handler需要是绝对地址,故需要重定位
   b. 如果被感染文件有SEH保护,还需要修改PE文件中的SEH表。因为被感染后的可执行文件发生异常,控制权转移到系统,要调用SEH处理函数时,系统会判断该SEH处理函数有没有在PE文件的SEH表中。我感染后调试时发现异常处理函数总是未被调用才意识到该问题。
三、SEH在exploit中的应用
   在看exploit tutorial part 3 SEH Based Exploit时,我产生了很大的困惑。使用了SEH的函数栈的结构如下:
   
  图中Params下面的Address of exception handler,完整的来说,是一个EXCEPTION_REGISTRATION结构。所谓的SEH exploit就是覆EXCEPTION_REGISTRATION结构,让系统执行我们的shellcode。
exploit tutorial part 3 SEH Based Exploit 中给予的覆盖时的流程解释如下:
 a. 覆盖的eip产生一个异常
 b. 当前的SE Handler地址被修改成进程空间里某个dll中的pop,pop,ret的地址
 c. 系统执行pop,pop,ret。在exception handler执行前,下一个SEH的地址被放在了ESP+8的位置上。通过pop.pop,ret 将这个地址放到eip中,执行在next SEH地址中的代码

a,b两步比较容易理解。c乍看之下,让人云里雾里的,尤其后面作者反复提到fake exception,我这种菜鸟就彻底晕了。其实,将c联系我们前面提到的异常处理函数原型,异常处理函数调用时栈的布局就不难理解了。
 pop  ;esp+0 被弹出  
 pop  ;esp+4 被弹出
 ret   ;esp+8被弹出,作为eip
esp+8存储的是EXCEPTION_REGISTRATION的地址。通过pop,pop,ret ,函数将会跳转到EXCEPTION_REGISTRATION地址处执行。我们写在EXCEPTION_REGISTRATION的prev中的数据将会被当成代码执行。
于是乎,我们的seh exploit就能构造成如下的形式了:
[Junk][nSEH][SEH][Nop-Shellcode]
其中nSEH=jmp xxx的机器码
    SEH=某个dll中pop,pop,ret的地址

四、SEH在反调试中的应用
  调试器发现:
  push seh_handler
  push fs:[0]
  mov fs:[0],esp
  
  xor eax,eax
  int 3
    
  pop fs:[0]
  add esp,4
  
  test eax,eax
  je debugger_found
  ....
  ...
  seh_handler:
  mov eax,[esp+0xc]
  mov dword [eax+0xb0],0xffffffff
  inc [eax+0xb8]
  xor eax,eax
  ret
  
  硬件断点发现:
  硬件断点的原理是Dr0-Dr3寄存器存储四个断点的地址,Dr6存储哪个断点被触发,Dr7存储控制四个断点启用/禁用的标识。所以只要查看该四个寄存器就知道是否有硬件断点了。要在用户态查看寄存器的值,得触发一个异常,通过SEH handler中的PCONTEXT获得
  Push seh
  Push fs:[0]
  Mov fs:[0],esp
  
  Xor eax,eax
  Mov dword ptr [eax],0
  Pop fs:[0]
  Add esp,4
  
  Test eax,eax
  Jnz bp_found
  ....
  ...
  Seh_handler:
  Mov eax,[esp+0xc]
  cmp dword ptr[eax+0x04],0
  Jne hdbp_found
  Cmp dword ptr[eax+0x08],0
  Jne hdbp_found
  Cmp dword ptr[eax+0x0c],0
  Jne hdbp_found
  Cmp dword ptr[eax+0x10],0
  Jne hdbp_found
  Jmp seh_ret
Hdbp_found:
  Mov dword ptr[eax+0xb0],0xffffffff
Seh_ret:
  Add dword ptr[eax+0xb8],6
  Xor eax,eax
  ret

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功