C++等pwn的换libc库的方法
前言
关于这个是我在打2023年的四川省赛的时候线下因为不会换libc,导致exp是能通的,但是在调libc的偏移的时候耗费了太多时间导致丢分
如何修改
对于c++的libc库也就是比c语言的库,多了几个C++的链接库罢了,并且会使用到该libc.so.6,就将对应的所以的链接库给改为那个版本即可
下面是一个C++的题需要的某些库文件,用ldd列出来即可
于是先把libc.so.6 替换掉,然后替换掉libm.so.6等等
但是值得注意的是,并不是说它链接的是哪个就去替换哪个
可以看到这个libstdc++.so.6最后是转到libstdc++.so.6.0.28的,于是我们需要去替换这个库就行
libc.so.6也是这样的
下面给出一个脚本,去修改下关联数组即可,最后再用 –set-interpreter 替换运行库即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
executable_file="chall"
new_ld_path="../lib64/ld-linux-x86-64.so.2"
declare -A libraries_to_replace libraries_to_replace=( ["libstdc++.so.6"]="../lib/x86_64-linux-gnu/libstdc++.so.6.0.28" ["libgcc_s.so.1"]="../lib/x86_64-linux-gnu/libgcc_s.so.1" ["libm.so.6"]="../lib/x86_64-linux-gnu/libm-2.31.so" ["libc.so.6"]="../lib/x86_64-linux-gnu/libc-2.31.so" )
if [ ! -f "$executable_file" ]; then echo "可执行文件 $executable_file 不存在" exit 1 fi
patchelf --set-interpreter "$new_ld_path" "$executable_file"
for library in "${!libraries_to_replace[@]}"; do new_library_path="${libraries_to_replace[$library]}" patchelf --replace-needed "$library" "$new_library_path" "$executable_file" if [ $? -eq 0 ]; then echo "已成功替换库 $library 为 $new_library_path" else echo "替换库 $library 时出错" exit 1 fi done
echo "所有库文件和 ld 文件替换完成"
|