• 堆溢出的一些思考


    之前在大学的时候就看过堆溢出,感觉好绕,看不懂,后来也凑合看懂了,最近突然想简单总结两句。

    首先,堆的维护和栈的维护不一样,栈是由CPU维护的,是运行的基础必须存在;而堆是对栈的补充,由操作系统维护。

    操作系统为了管理堆(动态内存分配),需要额外的代码,不同操作系统有不同,甚至同样的操作系统可能提供好几种管理方法,比如RT-Thread就有三种。

    为了操作系统可以正确的管理堆,堆的头部都会有一个“标牌”,这个标牌确定了堆的地位,上下位置等。

    “标牌”中的值,尤其是链表地址一类的东西,在内存管理器中是作为  左值   存在的,这意味着如果“标牌”中的值飞了,管理器就会向不可控的位置“瞎写”。

    堆攻击的根本就是改动“标牌”,无论是溢出还是double free,本质都是改动“标牌”的值,然后假借堆管理unlink的手进行内存任意写。

    堆溢出的话就是通过溢出改动下一个临近堆的“标牌”。

    double free中,就是借着第一次free拿到更改标牌的机会,之后通过第二次free触发标牌的ulink使用,假借堆管理unlink的手进行内存任意写。

    所以针对堆攻击的研究,首先要去看堆管理器的代码,熟悉逻辑之后,确定“标牌”中的值会被在何时何地作为左值利用。之后才是分析应用是否给了我们改动“标牌”的机会。

  • 相关阅读:
    【20220502】连岳摘抄
    【20220423】家是孩子最重要的教育场所
    【20220425】连岳摘抄
    【20220430】连岳摘抄
    【20220427】二宝让我们省吃俭用
    【20220503】连岳摘抄
    工作感受月记202205月
    Appium实现百词斩
    Appium自动微信读书打卡
    删除ssh 连接缓存
  • 原文地址:https://www.cnblogs.com/backahasten/p/11661901.html
Copyright © 2020-2023  润新知