C++等pwn的换libc库的方法

前言

关于这个是我在打2023年的四川省赛的时候线下因为不会换libc,导致exp是能通的,但是在调libc的偏移的时候耗费了太多时间导致丢分

如何修改

对于c++的libc库也就是比c语言的库,多了几个C++的链接库罢了,并且会使用到该libc.so.6,就将对应的所以的链接库给改为那个版本即可

下面是一个C++的题需要的某些库文件,用ldd列出来即可

image-20231022160153372

于是先把libc.so.6 替换掉,然后替换掉libm.so.6等等

但是值得注意的是,并不是说它链接的是哪个就去替换哪个

可以看到这个libstdc++.so.6最后是转到libstdc++.so.6.0.28的,于是我们需要去替换这个库就行

image-20231022163348319

libc.so.6也是这样的

image-20231022163455592

下面给出一个脚本,去修改下关联数组即可,最后再用 –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
#!/bin/bash

# 设置可执行文件的路径
executable_file="chall"

# 设置新的 ld 文件路径
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设置新的ld文件路径
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 文件替换完成"