堆的调试实验

  • 调试态堆管理策略和常态堆管理策略:前者只使用空表不用块表,不真实

  • 使用调试器加载函数会触发前者

  • __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处

    • 释放后:

  • 空表和块表堆块区别

  • 块首只存指向下一堆块的指针,不存在指向前一堆块的指针

  • 块首中的标识位为 0x01,也就是这个堆块是 Busy 状态

0day堆(2)堆的调试实验的更多相关文章

  1. 0day堆(1)堆的管理策略

    基本概念 堆块:堆区内存的基本单位 包括两个部分:块首,块身 块首:标识这个堆块自身的信息:如大小,是否被占用等 块身:分配给用户使用的数据区 堆表:一般位于堆区的起始位置,用于索引堆区所有堆块的信息 ...

  2. C++ 堆 和 堆 分析

    [摘要] 堆和栈,即是数据结构,又是分配存储空间的不同方式.在数据结构上.堆是树型层次结构,结点按keyword次序排列,经常使用的堆为二叉堆:栈是一种先进后出的数据结构.在内存分配上的堆和栈,首要差 ...

  3. 【ZZ】堆和堆的应用:堆排序和优先队列

    堆和堆的应用:堆排序和优先队列 https://mp.weixin.qq.com/s/dM8IHEN95IvzQaUKH5zVXw 堆和堆的应用:堆排序和优先队列 2018-02-27 算法与数据结构 ...

  4. SQL0973N在 "<堆名>" 堆中没有足够的存储器可用来处理语句

    SQL0973N在 "<堆名>" 堆中没有足够的存储器可用来处理语句. 解释: 已使用此堆的所有可用内存.不能处理该语句. 用户响应: 接收到此消息(SQLCODE)后 ...

  5. bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle——小根堆+大根堆+贪心

    Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i群牛一共有Mi(1& ...

  6. <JVM下篇:性能监控与调优篇>补充:浅堆深堆与内存泄露

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  7. 【算法】01-数据结构概述(注意区分jvm堆与堆/jvm栈与栈)

    [算法]01-数据结构概述(注意区分jvm堆与堆/jvm栈与栈) 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有 ...

  8. Python3实现最小堆建堆算法

    今天看Python CookBook中关于“求list中最大(最小)的N个元素”的内容,介绍了直接使用python的heapq模块的nlargest和nsmallest函数的解决方式,记得学习数据结构 ...

  9. 堆+建堆、插入、删除、排序+java实现

    package testpackage; import java.util.Arrays; public class Heap { //建立大顶堆 public static void buildMa ...

随机推荐

  1. Nginx是什么东东?

    Nginx的产生 没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器.基于REST架构风格,以统一资源描述符(Unifor ...

  2. [vijos1145]小胖吃巧克力<概率dp>

    题目链接:https://vijos.org/p/1145 貌似还有一个一样的题是poj1322 chocolate,两个题只是描述不一样,意思都是一样的,不贵最近貌似poj炸了,所以也没法去poj ...

  3. P3381 【模板】最小费用最大流 题解

    CSDN同步 原题链接 前置知识: 从三种算法剖析网络流本质 简要题意: 给定网络图,求图的最大流,以及流量为最大流时的最小费用. 现在假设你们看了那篇网络流博客之后,所有人都会了 \(\text{E ...

  4. webpack中引用jquery

    1.首先需要添加项目中jquery的依赖 npm install jquery --save-dev 2.参考配置代码: var webpack = require("webpack&quo ...

  5. String 对象-->toUpperCase() 方法

    1.定义和用法 将字符串中所有的小写字符转换成大写字符,大写字符保持不变 返回转换后的结果字符串 语法: string.toUpperCase() 注意:不会改变字符串本身,仅以返回值的形式返回结果 ...

  6. "被删除的文本"组件:<del> —— 快应用组件库H-UI

     <import name="del" src="../Common/ui/h-ui/text/c_tag_del"></import> ...

  7. k8s pod yaml参数说明

  8. 非PDC角色DC强制NTP

    前一阵,公司其他部门员工告诉我,他们的系统无法通过LDAP搜索账户了 经过检查,发现该服务器的时间居然比我们的时间服务器PDC快了将近20分钟,而且该问题机器的 时间源并非PDC,而是另外一台普通DC ...

  9. coding++:Spring 中的 AOP 原理

    为什么使用 AOP 如下场景: 现在有一个情景: 我们要把大象放进冰箱,步骤为:打开冰箱->放入大象->关闭冰箱 如果再把大象拿出来,步骤为:打开冰箱->拿出大象->关闭冰箱 ...

  10. Codeup 25594 Problem H 例题5-8 Fibonacci数列

    题目描述 输入一个正整数n,求Fibonacci数列的第n个数.Fibonacci数列的特点:第1,2个数为1,1.从第3个数开始,概述是前面两个数之和.即: 1,1,2,3,5,8,13,21 - ...