0day堆(2)堆的调试实验
2024-08-29 20:43:47
堆的调试实验
调试态堆管理策略和常态堆管理策略:前者只使用空表不用块表,不真实
使用调试器加载函数会触发前者
__asm int3 调试最真实的栈
未启用块表的堆区信息
堆区起始位置(假设为0x00520000)
起始位置开始依次是段表索引,虚表索引,空表使用标识和空表索引区
空表索引区的位置是偏移0x178处
一个堆刚刚初始化时堆块的状态:
- 只有一个空闲的大块(尾块)
- 位于堆偏移0x0688处(启用块表后这个位置将是快表)(忽略掉8字节块首)
- Freelist[0]指向尾块
- 处零号空表索引外其余均指向自己,其余的空闲链表中都没有空闲堆块
块首:8字节
调试实验中堆分配的细节
(1)堆块的大小包括了块首在内,即如果请求 32 字节,实际会分配的堆块为 40 字节:8
字节块首+32 字节块身。
(2)堆块的单位是 8 字节,不足 8 字节的部分按 8 字节分配。
(3)初始状态下,快表和空表都为空,不存在精确分配。请求将使用“次优块”进行分配。
这个“次优块”就是位于偏移 0x0688 处的尾块。
(4)由于次优分配的发生,分配函数会陆续从尾块中切走一些小块,并修改尾块块首中的
size 信息,最后把 freelist[0]指向新的尾块位置。(找零钱)块表的状态HeapCreat(0,0,0)
变化:
- 尾块不再是0x0688偏移处,通过0x0178Freelist[0]处可以看出
堆刚初始化时块表是空的
申请8,16,24字节的堆空间再释放后:
- 之前0x0688处
- 释放后:
- 之前0x0688处
空表和块表堆块区别
块首只存指向下一堆块的指针,不存在指向前一堆块的指针
块首中的标识位为 0x01,也就是这个堆块是 Busy 状态
最新文章
- UVA1586
- 【C++实现python字符串函数库】strip、lstrip、rstrip方法
- 优先使用最新版本的IE 和 Chrome 内核 1 <;meta http-equiv=";X-UA-Compatible"; content=";IE=edge,chrome=1";>;
- 跟服务器交互的Web表单(form)
- GL_GL系列 - 会计期间管理分析(案例)
- MVC 的知识
- typdef struct 语法
- Javascript自执行匿名函数(function() { })()的原理浅析
- 国外成熟的程序交易系统的思路 z
- c++适配器模式
- Codeforces 474 F. Ant colony
- 极路由1s,固件需要刷入RipOS系统的加40块
- Android中与task相关的几个属性
- 《深入理解Java虚拟机》学习笔记(二)
- MySQL查询所有数据库表出错
- SpringMVC中post请求参数注解@requestBody使用问题
- UOJ219 NOI2016 优秀的拆分 二分、字符串哈希
- myBatis外部的resultMap高级应用
- table border
- css3的一个小demo(箭头hover变化)
热门文章
- 小案例带你揭秘JS事件
- C 神奇项链
- B【SDOI2008】Sandy的卡片
- (C++ Error: Incompatible types in assignment of ‘char*’ to ‘char [2])
- VBScript - 弹出“文件选择对话框”方法大全!
- http的部署和使用
- 在Android Studio中导入jar包
- SpringMVC(二):使用注解开发
- 家庭版记账本app开发进度。开发到现在整个app只剩下关于图表的设计了,具体功能如下
- Linux 任务管理篇(一)