今天来水一篇博客。。。
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
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
完结撒花