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

news2024/9/21 19:38:02

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

  • 🍚前言
  • 🥟安装
  • 🥟glibc-all-in-one下载与调整libc
  • 🥟patchelf更改libc
  • 🥟clibc的使用与分析

🍚前言

现在市面上有很多关于改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

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

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

if  [ "$3" ];then
if  [[ "$LIBC_VERSION" > "2.33" ]];then
	patchelf --set-interpreter $libc_dir/ld-linux-x86-64.so.2 --set-rpath $WORKDIR/ $1
else
	patchelf --set-interpreter $libc_dir/ld-$LIBC_VERSION.so --set-rpath $WORKDIR/ $1
fi
elif  [[ "$LIBC_VERSION" > "2.33" ]];then
	patchelf --set-interpreter $libc_dir/ld-linux-x86-64.so.2 --set-rpath $libc_dir/ $1
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的方法或者之前就有人说过我这个方法的,欢迎在评论区留个坐标。如果按照上述方法来做出现了问题,例如没有符号表等,可以在评论区留言,我看到了就一定会回复的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA中实现springboot热部署

IDEA中实现springboot热部署 热部署: 每一次修改代码后会自动更新&#xff0c;无需每次重启 依赖(pom.xml) 修改后记得Reload一下 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><…

微信小程序IOS真机调试-onPullDownRefresh和onReachBottom不生效

切换真机调试2.0版本 勾选JS编译成ES5 如果使用了 uniapp&#xff0c;这里也需要勾选 重新启动

系统架构笔记-3-信息系统基础知识

知识要点 结构化方法&#xff1a;结构是指系统内各个组成要素之间的相互联系、相互作用的框架。结构化方法也称为生命周期法&#xff0c;是一种传统的信息系统开发方法&#xff0c;由结构化分析、结构化设计、结构化程序设计三部分有机组合而成&#xff0c;精髓是自顶向下、逐…

Java笔试面试题AI答之设计模式(2)

文章目录 6. 什么是单例模式&#xff0c;以及他解决的问题&#xff0c;应用的环境 &#xff1f;解决的问题应用的环境实现方式 7. 什么是工厂模式&#xff0c;以及他解决的问题&#xff0c;应用的环境 &#xff1f;工厂模式简述工厂模式解决的问题工厂模式的应用环境工厂模式的…

高算力芯片的发展

最近参与了2024年北京AI芯片峰会&#xff0c;虽然是讲AI芯片&#xff0c;但因为目前算力主要讲的是智能算力&#xff0c;所以&#xff0c;针对高算力芯片的发展趋势有重点的讲解。之前没有很系统关注这块&#xff0c;这次算是做了全面了解。下面&#xff0c;借用峰会的一些内容…

九章云极DataCanvas公司荣获2024年服贸会“科技创新服务示范案例”

9月15日&#xff0c;2024年中国国际服务贸易交易会&#xff08;服贸会&#xff09;示范案例交流会暨颁奖典礼在北京国家会议中心举行&#xff0c;九章云极DataCanvas 公司自研的DataCanvas Alaya NeW智算操作系统凭借卓越的AI创新实力、前瞻性的市场布局以及突破性的技术革新成…

uniapp中使用echarts 完整步骤,包括报错以及解决方案

在我们日常可能会有小程序中要使用echarts&#xff0c;我今天总结了一下整个引入的步骤 首先echarts - DCloud 插件市场在插件市场里面导入进项目&#xff0c;我这边用的是vue3的以及主要开发小程序&#xff0c;就直接放我的案例了 按照上面的步骤&#xff0c;在样式部分这样…

javaseday28 IO

IO流 IO流;存储和读取数据的解决方案。 纯文本文件&#xff1a;Windows自带的记事本打开能读懂的文件&#xff0c;word和Excel不是纯文本文件&#xff0c;txt和md是纯文本文件。 小结 IO流体系 FileOutputStream public class Demo1 {public static void main(String[] args)…

【学习笔记】 使用AD24完成相同电路的自动布线布局(相同模块布局布线ROOM布线快速克隆)

【学习笔记】 使用AD24完成相同电路的自动布线布局 一、适用基本条件二、基于ROOM的自动布局/布线的方法三、可能出现的报错四、ROOM自动布局的一些优点和缺点 当面对多个相同电路模块时&#xff0c;使用 ROOM 可以一次性对一个模块进行精心布局&#xff0c;然后将该布局快速复…

2024 研究生数学建模竞赛(C题)建模秘籍|数据驱动下磁性元件的磁芯损耗建模|文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;运用数据拟合&#xff0c;方差分析&#xff08;ANOVA&#xff09;&#xff0c;特征提取&#xff0c;多目标优化等强大工具&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案…

vs2022快捷键异常不起作用解决办法

安装了新版本的vs2022&#xff0c;安装成功后&#xff0c;发现快捷键发生异常&#xff0c;之前常用的快捷键要么发生改变&#xff0c;要么无法使用&#xff0c;比如原来注释代码的快捷键是ctrlec&#xff0c;最新安装版本变成了ctrlkc&#xff0c;以前编译代码的快捷键是F6或者…

go webapi上传文件 部属到linux

go厉害的地方&#xff0c;linux服务器上无需安装任务依赖就可以运行&#xff0c;大赞&#xff01; 一、编译 #在Goland中cmd中执行 go env -w GOARCHamd64 go env -w GOOSlinux go build main.go # 切换回来 否则无法运行 go env -w GOOSwindows go run main.go 拷贝到linux服…

ubuntu如何进行自动mount硬盘(简易法)

1. 找到你ubuntu的disk工具 2. 选中你要mount的盘 3. 点击那个设置按钮 4. 选择edit mount options 5. disable user session defaults 6, 填写Mount Point就可以了&#xff0c; 最后输入一次密码&#xff0c;重启设备就搞定了

DOG:知识图谱大模型问答的迭代交互式推理,克服长路径和假阳性关系挑战

DOG&#xff1a;知识图谱大模型问答的迭代交互式推理&#xff0c;克服长路径和假阳性关系挑战 秒懂大纲提出背景解法拆解全流程优化和医学关系 创意 秒懂大纲 ├── DoG框架【主题】 │ ├── 背景【研究背景】 │ │ ├── LLMs的局限性【问题描述】 │ │ │ …

pgvector docker版安装;稀疏向量使用;psycopg2 python连接使用

参看: https://cloud.tencent.com/developer/article/2359831 https://hub.docker.com/r/pgvector/pgvector/tags https://github.com/pgvector/pgvector 一、安装 拉取0.7版本 docker pull pgvector/pgvector:0.7.4-pg16运行: docker run --name pgvector -v $(pwd)/dat…

OpenLayers 开源的Web GIS引擎 - 地图初始化

在线引用&#xff1a; 地址&#xff1a;OpenLayers - Get the Code 离线引用&#xff1a; 下载地址&#xff1a;Releases openlayers/openlayers GitHub v10.0.0版本 地图初始化代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><…

Spring Boot 入门:解锁 Spring 全家桶

前言 Spring 全家桶是现代 Java 开发者不可或缺的工具集&#xff0c;它提供了从轻量级的框架到微服务架构的完整支持。本文将带你快速了解 Spring 框架、核心概念如 IoC&#xff08;控制反转&#xff09;和 AOP&#xff08;面向切面编程&#xff09;&#xff0c;并深入介绍 Sp…

Java项目实战II基于Java+Spring Boot+MySQL的网上租贸系统设计与实现(开发文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 "随着…

hpux B.11.31 安装 JDK(详细步骤、多图预警)

目录 零、测试环境 一、获取 JDK 安装包 二、安装 JDK 1、操作指南 2、安装流程 &#xff08;1&#xff09;选中 Java JDK &#xff08;2&#xff09;&#xff08;可选&#xff09;选择安装目录 &#xff08;3&#xff09;点击安装 &#xff08;4&#xff09;&#xf…

CefSharp_Vue交互(Element UI)_WinFormWeb应用(4)--- 最小化最大化关闭窗体交互(含示例代码)

一、效果预览 实现功能,通过vue页面模仿窗体的三个功能按钮实现最小化最大化关闭功能 1.1 预览 1.2 代码 页面代码