pwn中libc版本切换编译
一、手动编译
1.下载对应libc的源码:以2.32为例:glibc-2.32.tar.gz
(1)官网:https://ftp.gnu.org/gnu/glibc/
(2)清华镜像源:https://mirrors.tuna.tsinghua.edu.cn/gnu/glibc/
2.解压,然后新建文件夹来存储编译结果:
1 | #注释头 |
3.编译:
1 | #注释头 |
这里的–prefix=****需要一个绝对路径,不能时相对路径,对于pwn来说就好了,不用再接着往下安装了。不过这是64位的,32位得如下:
1 | #注释头 |
基本是差不多的。
4.找libc.so 和 ld.so文件:
(1)libc.so 在glibc-2.32_build目录下
(2)ld.so 在glibc-2.32_build/elf 目录下
5.使用:
1 | #注释头 |
这样就可以gdb调试的时候带符号表,然后还有源码:
▲关于ld.so的连接使用,最好还是用编译配套的,不然容易出错。如果不需要源码,只需要按照的libc和ld,就可以make install。然后在glibc-2.32_out/lib/下就能找到这两个文件了。
二、对应docker下载:
1.搜对应版本libc对应的ubuntu,比如libc-2.27就对应ubuntu18.04,然后pull下来。
2.然后将对应版本的docker源sources.list拷贝进去,然后我这边自己总结了一份安装脚本,一键运行,省去很多麻烦。(记得先备份一下,防止出错)
1 | docker cp sources.list [dockerName]:/etc/apt/ |
装完之后基本的环境就有了,pwndbg,python,pwntools等等,其他的自己慢慢安装吧。
▲有个pwn_docker也挺好使的:
1 | #注释头 |
里面运行也类似不同版本的libc:
1 | #注释头 |
三、工具使用:LibcSearcher
这个算是最常用了,很好用,直接去github上找很多,外面也有很多教程。
四、patchelf:直接修改ELF文件加载的libc
1.安装:
1 | #注释头 |
编译环境啥的都要有
2.使用:
https://github.com/NixOS/patchelf
1 | #注释头 |
这个可以直接gdb调试,不用再用python打开指定环境。
五、gdb指定源码级别调试:
▲有时候用Patchelf切换之后,想调试对应版本的glibc源码
1.gdb打开后直接命令输入指定:
1 | #注释头 |
2.gdb环境配置输入:
1 | #注释头 |
但是这有个问题,如果需要对应版本则没办法,只会加载到最下面的版本,所以一般patchelf之后,指定dir即可。