使用带 debug symbol 的低版本 glibc

今天来水一篇博客。。。

pwn 选手逃不开的,就是在低版本的 glibc 上操作了,有一些简单的办法可以使程序跑在低版本的 glibc 上。听我慢慢写来。。。

0X00 下载并编译低版本的 glibc

  • 选择 glibc 版本并下载、解压

我用 wget 下载下来:

wget https://ftp.gnu.org/gnu/glibc/glibc-2.23.tar.gz 

解压:

tar xvf glibc-2.23.tar.gz 

进入解压目录:

cd glibc-2.23
mkdir build
cd build

选择带 debug symobl 以及配置好安装位置,这一步非常重要!这一步没做好直接 GG

CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" ../configure --prefix=/home/tenshine/Desktop/glibc-2.23/64

CFLAGS、CXXFLAGS 与 debug symobl 有关

--prefix 是安装目录,由于我的 glibc 装在桌面上所以就安装在 /glibc-2.23/64 中

  • 编译和安装
make && make install

如果出现这样的错误:

/tmp/ccPRCqlU.s: Error: `loc1@GLIBC_2.2.5' can't be versioned to common symbol 'loc1'
/tmp/ccPRCqlU.s: Error: `loc2@GLIBC_2.2.5' can't be versioned to common symbol 'loc2'
/tmp/ccPRCqlU.s: Error: `locs@GLIBC_2.2.5' can't be versioned to common symbol 'locs'

解决方案:https://patchwork.ozlabs.org/patch/780067/

就是在 /misc/regexp.c 中增改几行代码

0X01 使用低版本的 glibc

安装 patchelf:https://github.com/NixOS/patchelf

现在我们写一个测试样例:

// hello.c
# include<stdio.h>
int main() {
    printf("hello world");
    return 0;
}
gcc hello.c -o hello -g

-g 是带着 debug symbol

我们用 pwngdb 打开:

gdb hello

在 printf 处打断点

b printf
c

如果没有带 debug symbol 的 glibc,我们是没有办法看到 printf 源码的就像这样:

由于我们用的是我们自己的 glibc,所以没有 debug symbol,现在我们开始使用,我们刚编译好的低版本的带 debug symbol 的 libc

下载 patchelf:https://github.com/NixOS/patchelf

按文档安装好以后,我们就可以改变 dl 的位置了:

之前,dl 的位置是被写死的,用 patchelf 改变 elf 文件中 ld 的位置,写绝对路径!!!

patchelf --set-interpreter /home/tenshine/Desktop/glibc-2.23/64/lib/ld-2.23.so hello

现在再用 gdb 打开

gdb hello 
b printf
c

完结撒花

推荐阅读更多精彩内容