首页
社区
课程
招聘
[旧帖] [求助]关于win2k下堆结构的疑问 0.00雪花
发表于: 2014-7-12 11:08 2895

[旧帖] [求助]关于win2k下堆结构的疑问 0.00雪花

2014-7-12 11:08
2895
这是我在看0day第二版第五章时的疑问。
书里说占用态堆块结构的前4个字节表示了它的大小,也就是1,2字节表示了堆块有几个单位,3,4字节表示一个单位有几个字节。我按照书里这一个程序做实验:
#include<windows.h>
main()
{
	HLOCAL h1,h2,h3,h4,h5,h6;
	HANDLE hp;
	hp = HeapCreate(0,0x1000,0x10000);
	
	//__asm int 3

	h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,3);
	//__asm int 3
	h2 = HeapAlloc(hp,HEAP_ZERO_MEMORY,5);
	__asm int 3
	h3 = HeapAlloc(hp,HEAP_ZERO_MEMORY,6);
	//__asm int 3
	h4 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8);
	h5 = HeapAlloc(hp,HEAP_ZERO_MEMORY,19);
	h6 = HeapAlloc(hp,HEAP_ZERO_MEMORY,24);
	__asm int 3

	HeapFree(hp,0,h1);
	HeapFree(hp,0,h3);
	HeapFree(hp,0,h5);

	HeapFree(hp,0,h4);

}

第一个分配,也就是h1,很正常,它的块首是这样:
02 00 08 00 00 01 0D 00
也就是说大小是16字节,已使用13字节(剩余正好是3字节)
但是从第二个开始就很奇怪了:
02 00 02 00 00 01 0B 00
02 00 02 00 00 01 0A 00
02 00 02 00 00 01 08 00
04 00 02 00 00 01 0D 00
04 00 04 00 00 01 08 00
看起来只有堆块单位数是对的,但是每单位字节数是错的。但是我用heapsize都能得到想要的大小(3 5 6 8 19 24)
请问是我理解错了块首那个size那里吗?还是什么问题?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
貌似直接没人看啊……
2014-7-12 11:11
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看来这个论坛完全没人回答,都是我们小菜在提问或者扯淡……
算了
2014-7-15 14:17
0
雪    币: 435
活跃值: (1212)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
4
这个东西研究的人太少了
即使有研究过 也很难你一问就正好能清楚的想起来
2014-7-15 16:03
0
雪    币: 435
活跃值: (1212)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
5
另外我随手百度了下
你看这个是不是你说的数据结构
ntdll!_HEAP_ENTRY
   +0x000 Size             
   +0x002 PreviousSize    
   +0x000 SubSegmentCode  
   +0x004 SmallTagIndex   
   +0x005 Flags    
   +0x006 UnusedBytes 
   +0x007 SegmentIndex  


如果是那就是你理解错了
第二个size是前一个堆块大小,以分配粒度为单位
2014-7-15 16:15
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我煞笔了,理解错了……
2014-7-16 15:39
0
游客
登录 | 注册 方可回帖
返回
//