SEH浮想联翩(应用)

谈过理论,下面是应用。


二.SEH在virus中的应用


SEH能让我们的asm代码更健壮,xfish的系列文章已经有描述了。直接看:


//bbs.pediy.com/showthread.php?t=86452


同时可以用SEH去做免杀,对抗模拟器。


前提假设是模拟器没法模拟异常。思路如下:


callseh


seh_handler:


moveax,[esp+0xc]


movcl,0xb8


adddword[eax+ecx],5;跳过jmp语句,到virus处执行


xoreax,eax


ret


seh:


pushfs:[0]


movfs:[0],esp


@except:


xoreax,eax


mov[eax],0


jmp@except


virus:


…….





此处需要注意两点:


a.由于sehhandler需要是绝对地址,故需要重定位


b.如果被感染文件有SEH保护,还需要修改PE文件中的SEH表。因为被感染后的可执行文件发生异常,控制权转移到系统,要调用SEH处理函数时,系统会判断该SEH处理函数有没有在PE文件的SEH表中。我感染后调试时发现异常处理函数总是未被调用才意识到该问题。

三、SEH在exploit中的应用


在看exploittutorialpart3SEHBasedExploit时,我产生了很大的困惑。使用了SEH的函数栈的结构如下:





图中Params下面的Addressofexceptionhandler,完整的来说,是一个EXCEPTION_REGISTRATION结构。所谓的SEHexploit就是覆EXCEPTION_REGISTRATION结构,让系统执行我们的shellcode。


exploittutorialpart3SEHBasedExploit中给予的覆盖时的流程解释如下:


a.覆盖的eip产生一个异常


b.当前的SEHandler地址被修改成进程空间里某个dll中的pop,pop,ret的地址


c.系统执行pop,pop,ret。在exceptionhandler执行前,下一个SEH的地址被放在了ESP+8的位置上。通过pop.pop,ret将这个地址放到eip中,执行在nextSEH地址中的代码

a,b两步比较容易理解。c乍看之下,让人云里雾里的,尤其后面作者反复提到fakeexception,我这种菜鸟就彻底晕了。其实,将c联系我们前面提到的异常处理函数原型,异常处理函数调用时栈的布局就不难理解了。


pop;esp+0被弹出


pop;esp+4被弹出


ret;esp+8被弹出,作为eip


esp+8存储的是EXCEPTION_REGISTRATION的地址。通过pop,pop,ret,函数将会跳转到EXCEPTION_REGISTRATION地址处执行。我们写在EXCEPTION_REGISTRATION的prev中的数据将会被当成代码执行。


于是乎,我们的sehexploit就能构造成如下的形式了:


[Junk][nSEH][SEH][Nop-Shellcode]


其中nSEH=jmpxxx的机器码


SEH=某个dll中pop,pop,ret的地址


四、SEH在反调试中的应用


调试器发现:


pushseh_handler


pushfs:[0]


movfs:[0],esp





xoreax,eax


int3





popfs:[0]


addesp,4





testeax,eax


jedebugger_found


….





seh_handler:


moveax,[esp+0xc]


movdword[eax+0xb0],0xffffffff


inc[eax+0xb8]


xoreax,eax


ret





硬件断点发现:


硬件断点的原理是Dr0-Dr3寄存器存储四个断点的地址,Dr6存储哪个断点被触发,Dr7存储控制四个断点启用/禁用的标识。所以只要查看该四个寄存器就知道是否有硬件断点了。要在用户态查看寄存器的值,得触发一个异常,通过SEHhandler中的PCONTEXT获得


Pushseh


Pushfs:[0]


Movfs:[0],esp





Xoreax,eax


Movdwordptr[eax],0


Popfs:[0]


Addesp,4





Testeax,eax


Jnzbp_found


….





Seh_handler:


Moveax,[esp+0xc]


cmpdwordptr[eax+0x04],0


Jnehdbp_found


Cmpdwordptr[eax+0x08],0


Jnehdbp_found


Cmpdwordptr[eax+0x0c],0


Jnehdbp_found


Cmpdwordptr[eax+0x10],0


Jnehdbp_found


Jmpseh_ret


Hdbp_found:


Movdwordptr[eax+0xb0],0xffffffff


Seh_ret:


Adddwordptr[eax+0xb8],6


Xoreax,eax


ret

SEH浮想联翩(应用)

相关文章:

你感兴趣的文章:

标签云: