author: Tamako
先上两个美化的链接,不用zsh的
字体
样式,颜色
成品
切换libc
我的工具机是Ubuntu 18.04。
获取libc版本
这个很容易,通过运行libc就可以直接获取,比如buu的Ubuntu16.04 32位机使用的libc
当然有些libc运行的时候会出现错误,这个时候放到ida里面反编译一下就可以了,效果是一样的。
实际上用 strings 指令也可以 strings libc.so.6 | grep "ubuntu"
,简单快捷
编译libc
准备工作
考虑到现在见到的都是2.23版本的libc,所有就只编译了这个版本
为了编译旧版本的libc,最好用旧版本的gcc,所以我们考虑安装一下,好消息是不同版本的gcc是可以共存的。
首先添加旧版本的镜像源。使用 sudo vim /etc/apt/sources.list
添加
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
然后 sudo apt-get update
更新源。
安装旧版本的gcc
sudo apt-get install gcc-4.8
sudo apt-get install gcc-4.8-multilib
sudo apt-get install g++-4.8
sudo apt-get install g++-4.8-multilib
sudo apt-get install gcc-5
sudo apt-get install gcc-5-multilib
sudo apt-get install g++-5
sudo apt-get install g++-5-multilib
添加到维护程序版本的 update-alternatives
中
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50 --slave /usr/bin/g++ g++ /usr/bin/g++-5
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 --slave /usr/bin/g++ g++ /usr/bin/g++-7
通过 sudo update-alternatives --config gcc
就可以切换版本了
编译2.23版本的libc时我们选择gcc-4.8
安装glibc-all-in-one
编译各个版本libc
git clone https://github.com/matrix1001/glibc-all-in-onecd glibc-all-in-onechmod 777 build download extractsudo ./build 2.29 amd64 #编译glibc
sudo ./build 2.27 amd64
没有编译32位的版本,考虑到32位用的少
位置在2.27和2.29的ld和libc在/glibc/2.2?/amd64中
但是2.23考虑了32位版本,采用手动编译
tar -zxvf glibc-2.23.tar.gz
cd glibc-2.23
建立目录并完成设置
64位
mkdir build64
cd build64
sudo CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error" ../configure --prefix=path_to_install
sudo make
sudo make install
32位
mkdir build32
cd build32
sudo CC="gcc -m32" CXX="g++ -m32" CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og" ../configure --prefix=/glibc/2.23/32 --host=i686-linux-gnu
sudo make
sudo make install
编译的时候报错了,解决方法如下
解决办法就是在这2个变量后面加 __attribute__ ((nocommon))
。他们在/glibc-2.23/misc/regexp.c中(第33行开始的)。
然后还是报错,发现还有这个。
也要改,三个都在一起,恒容易找到
记住改掉之后,重新make
这里我考虑使用patchelf
可以使用apt-get安装
sudo apt-get install patchelf
然后
patchelf --set-interpreter ./ld-linux.so.2 ./elfnamepatchelf --replace-needed libc.so.6 ./libc-2.23.so ./elfname或者patchelf --set-interpreter ./glibc-all-in-one-master/libs/2.31-0ubuntu9.2_amd64/ld-2.31.so --set-rpath ./glibc-all-in-one-master/libs/2.31-0ubuntu9.2_amd64 target_file
看这里
都试了一下,最好使的还是repath
patchelf --set-repath xxxxxxx pwn
xxxx是路径文件夹的路径,不过有个缺点就是只能放一个libc和ld。
patchelf --set-rpath ~/Desktop/vnctf2021/ff/ ff
例子。
这样的指令就可以设置了。第一条替换了ld,第二条替换了libc。第二条中的 libc.so.6
是目标文件 libc 软连接的名字,需要通过 ldd
指令来查看(一般都就是 libc.so.6
)
libc编译遇到的错误
pwn本地加载libc
但是32位安装报错一直没有解决,两个多小时遂放弃。