★pwn 更改pwn题libc保姆级教程★

🍚前言

现在市面上有很多关于改libc的教程,但是基本有以下几个问题:没有符号表、错误、过时、繁琐、高版本不适用。于是我找了一种最简单并且全libc通用的方法。现分享如下。

🥟安装

在开始前,需要安装一下本文所需软件

glibc-all-in-one

cd ~/
git clone https://github.com/matrix1001/glibc-all-in-one
cd ~/glibc-all-in-one
sudo python3 update_list
cd ..

patchelf

sudo apt install patchelf

clibc

cd ~/
git clone https://github.com/dsyzy/free-libc
cd ~/free-libc
sudo sh ./install.sh
cd ..

🥟glibc-all-in-one下载与调整libc

先确定好题目的libc是多少,题目可能没给libc,需要泄露获得,这不在本教程的考虑范围内。如果题目给了libc,可以通过以下命令来获得libc版本

strings libc.so.6 | grep ubuntu

其中,libc.so.6是libc的文件名,后面的ubuntu如果找不到这个字符串也可以找Ubuntu等等

在这里插入图片描述
这里可以看到libc版本是2.23-0ubuntu11.3
在这里插入图片描述

cat list
cat old_list

接下来进入glibc-all-in-one,命令cat list可以看到所有能够下载的libc版本,命令cat old_list可以看到不经常使用的libc版本。接下来下载2.23-0ubuntu11.3_amd64
在这里插入图片描述

./download 2.23-0ubuntu11.3_amd64

输入该命令即可下载,下载完成后,会保存在libs目录中
在这里插入图片描述
进入刚刚下好的2.23libc目录中,将能够看见隐藏文件打开
在这里插入图片描述
接下来能看到这个.debug目录,这个目录中保存了该libc的符号表信息
在这里插入图片描述
接着依次进入.debug,lib,x86_64-linux-gnu目录下,找到libc-2.23.so文件
在这里插入图片描述
将这个文件,放到.debug目录的根目录下。当然,其实也可以把那些文件全部拖到这里来。这里简洁一些

这样,就可以在不用动用gdb的命令情况下,patchelf更改好文件libc后,gdb打开文件,直接就能加载好符号表,非常方便。这是最关键的一步

在这里插入图片描述
2.31后大更改了一下符号表,2.31中,07这个目录中的debug文件是要找的,将这个文件放在.debug目录的根目录下即可
在这里插入图片描述
如图所示
2.34后的又有些许不同,不是在07这个目录中了,具体在哪个目录中我也没有尝试,而是采用全部复制到.debug根目录的方式。
在这里插入图片描述
下个2.35的libc,进入这里,接下来要将这些目录中的所有文件放到.debug目录的根目录下,命令是:

cp ./*/* ../

在这里插入图片描述
解释一下该命令。./*/*是要复制的内容,. ./是复制到这里去。./代表当前目录,. ./代表上一级目录,/*是指将该目录下的所有文件,而不包括该目录

./*/*连续两个杠星,先是将.build-id目录下的所有文件指定,再将每个文件看作目录,再指定每个目录下的文件而不复制目录。这个过程稍微有点复杂,大概的意思能理解即可
在这里插入图片描述
效果如上,即算复制成功

接下来利用patchelf更改libc,可以先准备好与libc适配的题目,像我之前发的文章中就给了题目

Lit CTF 2024,Litctf 2024中有2.23, 2.27, 2.31, 2.35, 2.39这5个版本的heap题目,本文用的就是这些题目

🥟patchelf更改libc

在这里插入图片描述
我个人习惯将2.23的libc文件直接从glibc-all-in-one中拖过来,等会改的时候比较方便
在这里插入图片描述
2.23的libc,输入命令:

patchelf heap --set-interpreter ./2.23-0ubuntu3_amd64/ld-2.23.so --set-rpath ./2.23-0ubuntu3_amd64

如上图,即可更改成功,可以用ldd查看

其中,–set-interpreter是设置ld,指定目录下的ld文件,–set-rpath设置了运行环境,指定libc的目录

在这里插入图片描述
gdb运行后,就能看到识别符号表成功
在这里插入图片描述
2.35以上略有不同,因为ld换成了默认的,没有具体的版本名了

patchelf heap --set-interpreter ./2.35-0ubuntu3.8_amd64/ld-linux-x86-64.so.2 --set-rpath ./2.35-0ubuntu3.8_amd64

在这里插入图片描述
加载符号表成功

9.23修改,增加了patchelf的其他一些命令
patchelf还有一些其他命令,可以稍微了解一下,也许有的时候会有用

patchelf pwn --replace-needed libc.so.6 ./libc-2.23.so

这个命令可以更改文件所需依赖,其中,pwn是要更改的文件名,libc.so.6是文件原依赖,./libc-2.23.so是文件要更改的依赖

patchelf pwn --add-needed libc.so.6 ./libc-2.23.so

这个命令可以增加文件所需依赖,稍微有点不同,其他同上

patchelf pwn --remove-needed libc.so.6

这个命令可以移除文件所需依赖,如果用–replace-needed或–add-needed改错了libc的话,可以用这个删除

🥟clibc的使用与分析

有人还嫌patchelf改的麻烦,命令太长,怎么办呢?可以写一个bash脚本来解决,github上已经有大佬写了一个脚本叫clibc,原理就是利用了patchelf的–set-interpreter和–set-rpath两个命令

接下来对这个bash脚本分析一下
在这里插入图片描述
打开.sh安装文件,开始自动下载了一下patchelf防止你没有,然后下载到了/usr/local/bin中,去那里看一下
在这里插入图片描述
找到clibc文件,可以看到确实是用的patchelf这两个命令,不过有瑕疵,因为这个脚本写的时间比较早,所以他脚本写的是ld-$LIBC_VERSION.so

而上文讲到了,libc在2.34后更改了ld的名称,统一叫ld-linux-x86-64.so.2,同时,如果是32位的话叫ld-linux.so.2,也要区分一下(9.22修改,增加了32位的区分

所以如果是要用clibc改2.34以上的libc会失效,导致文件打不开。因此稍微修改一下该脚本即可:
在这里插入图片描述

if  [ "$3" ];then
if  [[ "$LIBC_VERSION" > "2.33" ]];then
if [ $EBIT -eq "32" ];then
	patchelf --set-interpreter $libc_dir/ld-linux.so.2 --set-rpath $WORKDIR/ $1
else
	patchelf --set-interpreter $libc_dir/ld-linux-x86-64.so.2 --set-rpath $WORKDIR/ $1
fi
else
	patchelf --set-interpreter $libc_dir/ld-$LIBC_VERSION.so --set-rpath $WORKDIR/ $1
fi
elif  [[ "$LIBC_VERSION" > "2.33" ]];then
if [ $EBIT -eq "32" ];then
	patchelf --set-interpreter $libc_dir/ld-linux.so.2 --set-rpath $libc_dir/ $1
else
	patchelf --set-interpreter $libc_dir/ld-linux-x86-64.so.2 --set-rpath $libc_dir/ $1
fi
else
	patchelf --set-interpreter $libc_dir/ld-$LIBC_VERSION.so --set-rpath $libc_dir/ $1
fi
echo "success!!!"

我不是很会写bash脚本,改的比较乱,不过能用就行,如果检测到输入的libc版本大于2.33,就会用ld-linux-x86-64.so.2,具体libc是在哪个版本用的ld-linux-x86-64.so.2我没测,问题不大,一般是用2.31和2.35,不会用到32或33
在这里插入图片描述
使用前需要先将libc目录从glibc-all-in-one中拖到/usr/lib/freelibs/amd64这个目录中,64的就在amd64,如果是32的,就是拖到/usr/lib/freelibs/i386中
在这里插入图片描述

clibc heap 2.35

输入这个命令即可更改,其中,heap是你要更改的文件名,2.35是指定的libc版本,可以看到上图已经更改成功了

本教程到此就结束啦,本文所述方法目前应该是全网唯一,如果你有更好的换libc的方法或者之前就有人说过我这个方法的,欢迎在评论区留个坐标。如果按照上述方法来做出现了问题,例如没有符号表等,可以在评论区留言,我看到了就一定会回复的!

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YX-hueimie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值