堆的调试实验

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

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

  • __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. 用一个例子说说gRPC的四种服务方法

    本文通过一个简单的例子来演示这4种类型的使用方法 案例代码:https://github.com/codeAB/grpc-sample-example 目录结构说明 ├── calculator.pr ...

  2. 马哥教育PYTHON相关基础 笔记

    1 python 推荐书籍 <python Cookbook> <learn python the hard way> <google's python class> ...

  3. H - 蓬松的头发 HDU - 5504

    给你一个N个整数的序列. 你应该选择一些数字(至少一个),并使它们的乘积尽可能大. 它保证你在初始序列中选择的任何数的乘积的绝对值不会大于263−1. Input 在第一行有一个数字T(表示样例数). ...

  4. B. Lost Number【CF交互题 暴力】

    B. Lost Number[CF交互题 暴力] This is an interactive problem. Remember to flush your output while communi ...

  5. Vertica的这些事(十一)——-Vertica备份元数据信息

    ---备份资源池 SELECT 'CREATE RESOURCE POOL ' || name || CASE WHEN memorysize IS NULL THEN ' ' ELSE ' MEMO ...

  6. ajax使用POST提交报错400

    并非BadRequest!! 在用ajax访问登录接口的时候出现了这个错误,查阅得到使用Ajax的Post需要添加 contentType: "application/x-www-form- ...

  7. MVC分层设计

    MVC分层设计 什么是MVC? MVC 是一种软件架构模式,利用分层的思想来设计交互式应用程序,由以下3层组成: Model 业务模型层. View 展示层. Controller 控制层. MVC包 ...

  8. C#如何正确的做深拷贝

    估计很多人在网上看到各种各样的DeepClone实现, 例如: 1. 通过BinaryFormatter进行二进制序列化 这玩意儿序列化出来的东西还带namespace类型, 尺寸非常大, 调试一下就 ...

  9. 利用xposed hook Auto.js程序、解密其js脚本

    一.原理 原理很简单就是hook auto.js的com.stardust.autojs.script.StringScriptSource类,当然前题你要逆向的auto.js程序dex没有加固,当然 ...

  10. Js异步机制的实现

    Js异步机制 JavaScript是一门单线程语言,所谓单线程,就是指一次只能完成一件任务,如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推.这种模式的好处是实现起来比较简单 ...