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函数列表:
       

上一页    

原文地址:https://www.cnblogs.com/xdans/p/5412500.html