zoukankan      html  css  js  c++  java
  • Libheap:一款用于分析Glibc堆结构的GDB调试工具

    Libheap是一个用于在Linux平台上分析glibc堆结构的GDB调试脚本,使用Python语言编写。
           

      安装
      Glibc安装
      尽管Libheap不要求glibc使用GDB调试支持和符号进行编译,但是如果用户使用的话,也不会影响它的功能。已经有很多手动构建Glibc的指导说明,目前最合适的一个:
      Devpit – Building GLIBC
      Fedora上使用了以下简单的方法实现了该方法:
      debuginfo-install glibc
      使用该命令,系统会自动安装并设置调试Glibc。
      GDB安装
      如果用户使用的是较新版本的Fedora,其中的GDB使用加入了最新的python支持的新技术。否则,用户就需要从SVN中构建GDB,而不是使用Tom Tromey提供的步骤:
           

      这一步完成后,用户就会得到一个可以在archer/install/bin/gdb上运行的编译版本GDB。
      Libheap安装
      最后一步是安装Libheap库,这一步相对简单,只需要将其移动到Python路径(sys.path)下:
      $ mv libheap.py /usr/lib/python2.6
      用法
      加载libheap同加载其他Python库的方法类似:
           

      整体堆状态
      多个不同的状态用于输出堆的整体状态,如下:
      heap -h
           

      heap
          

      heap -b
          

      heap -f
          

      heap -f
          

      heap -s
         

      heap -l
          

      heap -c
         

      数据块
      libheap为用户提供了多种方法用于检查内存分配数据块。该库使用一个比较完善的malloc_chunk结构体输出程序,因此只要是有效的数据库,就可以输出其地址:
          

      为了获取数据库的更加细粒度的访问权限,libheap使用了一个代表内存分配数据块的python类:
          

      默认情况下,程序会将一个地址看作已释放的数据库,并读取malloc_chunk结构体的所有字段。但是如果用户传递一个名为‘inuse’的可选布尔项就可以改变这种情况。如果用户只是想要读取已分配数据块的头部,那么可以传入一个名为‘read_data’的可选布尔项。该类默认读取数据块中指定的任意大小的内存,这样显示是有弊端的:攻击者可以使用虚假的值覆盖size字段。因此程序设置了一个可选的size标志,用户可以指定真实的数据块大小。综上所述,用户可以访问和更改数据块中独立的字段:
         

      最后,如果用户想要查看内存分配数据块在堆实现中的表现形式,可以向该类传递一个行内存字符串,并查看解析情况:

       

           

      Glibc结构体
      libheap中还包含malloc_par和malloc_state结构体的输出程序。用户可以通过请求输出全局变量查看:
           

      以下为这两个重要结构体的Python类实现,用户可以使用这些类查看任意内存:
          

      便捷函数
      如果用户想要扩展该库或使用其中的任意功能,以下为在Python中重新实现的Glibc函数列表:
           

    上一页    

  • 相关阅读:
    Java 类加载机制详解
    设置菜单栏中和地址栏对应的活动项高亮
    相交链表
    二叉树的最大深度 递归
    买卖股票的最佳时机 一次遍历
    对称二叉树 递归&迭代
    二叉树的中序遍历 --采用递归
    最大子序和 动态规划
    前K个高频单词 字符型 用Hash表+Collections排序 + 优先队列
    加一 (运用取余数)
  • 原文地址:https://www.cnblogs.com/xdans/p/5412500.html
Copyright © 2011-2022 走看看