自选择glibc带符号版本调试

使用电脑浏览效果更佳!

摘要

​ 在学习堆内存管理器ptmalloc,想深入的了解各版本的glibc库在malloc,free中做的判断与安全保护(如double free的检测),挖掘一些glibc的漏洞与绕过手法,深入调试带符号的Glibc版本是有必要的(感觉上),在安装环境过程中,发现百度,Google在这方面的资料是在过于匮乏与过时,在此记录一些我在从下载对应版本Glibc库-> 编译带符号glibc库-> 修改当前程序loader-> gdb的lay src源码窗口调试的过程。

​ 刚入门pwn,说实话做pwn如果把堆内存学号应该是一个分水岭了吧,一年来纠结于提高专业课程的成绩与自己热爱的pwn学习中,断断续续的学,还真把一些知识重复的看了好几遍(看了过一段时间又忘了),也知道在安全方面有一个师傅是真的好(听说德国的工程师是师傅带徒弟的模式),希望有志同道合的朋友一起学习(扣扣:2280986957),也期盼有大佬手下小弟做徒弟-_-

方案介绍

一些google搜索关于源码调试glibc解决方案:

  • 方案一:

    安装官方编译好的glibc-dbg带符号调试版本

    1
    2
    3
    4
    5
    6
    # 其他版本 https://launchpad.net/ubuntu/+source/glibc/2.21-0ubuntu4
    # 如32位,此处安装的是64位
    sudo apt-get install libc6-dbg
    sudo apt-get source libc6-dev # sources.list 中dbkg-src的作用,下载源码

    # 参考 https://blog.csdn.net/u012927281/article/details/51289608

    显然,此处安装的是根据当前系统自带的glibc版本来安装对应调试版本,并不能自定义的选择glibc版本。此方案适用非安全专业适用也够了。

  • 方案二:

    自己选择Glibc版本下载进行编译安装。此方案可以自己选择glibc版本进行编译安装,且不用更改系统默认的glibc库,同时使用多个Glibc库。只需要更改调试程序的rpath即可

    此处选择方案二进行安装(实践、,可行)

    参考

带符号Glibc库调试环境

下载版本glibc库

1
http://ftp.gnu.org/gnu/glibc/

指定安装与源码存放的位置

1
2
3
4
# 如安装在
/usr/local/glibc/glibc2.23
# 源码存放
/home/thonsun/Desktop/glibc/glibc-2.23/

程序config配置

1
2
3
# 在下载源码的文件夹解压进入源码
mkdir build # 要在新的空的文件夹进行configure配置,存放makefile文件
# configure编译时提示:configure: error: you must configure in a separate build directory
  • x64的编译配置

    1
    2
    3
    4
    CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og"
    CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og"
    ../configure --prefix=/path/to/install
    # ../configure --prefix=/usr/local/glibc/glibc2.23 我的配置
  • x32的编译配置

    1
    2
    3
    4
    5
    6
    7
    # 在前面的已经生成64位的情况下,再同保留两个版本的要新建一个build32/,和安装文件夹x32/
    # /usr/local/glibc/glibc2.23/x32
    # /home/thonsun/Desktop/glibc/glibc-2.23/bulid32
    CC="gcc -m32" CXX="g++ -m32" \
    CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error" \
    CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og" \
    ../configure --prefix=/usr/local/glibc/glibc2.23/x32 --host=i686-linux-gnu
  • 安装

    1
    2
    3
    # 在root的shell
    su
    make && make install

修改loader

他们在程序运行加载的作用:

ELF interpreter:
RPATH:

1
2
3
4
5
6
7
8
9
10
11
12
# ubuntu16.04的更新源
https://blog.csdn.net/lym152898/article/details/79100507
# 安装pathelf
sudo apt-get install patchelf
# pathelf使用 https://nixos.org/patchelf.html

# 修改要调试的程序
# x64
patchelf --set-interpreter /usr/local/glibc/glibc2.23/lib/ld-linux-x86-64.so.2 --set-rpath /usr/local/glibc/glibc2.23/lib/ double_free
# x32
patchelf --set-interpreter /usr/local/glibc/glibc2.23/x32/lib/ld-linux.so.2 --set-rpath /usr/local/glibc/glibc2.23/x32/lib/ double_free32
# 注:ld-linux-x86-64.so.2为一个编译生成的lib库中的loader的ld-so.2的连接文件,会默认加载当前的libc

效果

  1. 检查程序依赖

    x64

    1563203720203

    x32

    1563205251945

  2. Double free检查

1
2
3
vim ~/.gdbinit
(gdb)>lay src
directory xxxx

1563202314979

pwn题选择libc版本

问题:低版本的ld-x.so无法加载高版本的libc-x.so(ld-x.so与libc-x.so的爱恨情仇)

解决:

  1. 自编译替换challenge binary的ld(loader | interpreter)和libc的加载路径 => patchelf
  2. 采用docker容器运行challenge binary,使用gdb远程attach

参考解决:

1
2
3
4
http://look3little.blogspot.com/2017/12/debug-symbolglibc.html
https://bbs.pediy.com/thread-225849.htm
http://brieflyx.me/2018/linux-tools/handling-so-hell/
https://www.cnblogs.com/xingzherufeng/p/9682660.html
您的支持是对thonsun技术原创分享的最大鼓励!