您现在的位置是:首页 > 数码 > 

CTF pwn中利用pwntools加载不同版本libc调试程序的方法

2025-07-25 22:12:44
CTF pwn中利用pwntools加载不同版本libc调试程序的方法 在网上到了很多加载libc的帖子,终于自己走通了一次,现在把方法和资源都整理一下 一、解决方案 python利用pwntools的代码 from pwn import * import pwnlib context(os= linux ,arch=

CTF pwn中利用pwntools加载不同版本libc调试程序的方法

在网上到了很多加载libc的帖子,终于自己走通了一次,现在把方法和资源都整理一下

一、解决方案

python利用pwntools的代码

from pwn  import *
import pwnlib
context(os=	linux	,arch=	amd64	,log_level=	debug	)if __name__ == 	__main__	:conn = process([	./ld-2.2.so	,	./pwn	], env = {	LD_PRELOAD	 : 	./libc-2.2.so	})pwnlib.gdb.attach(conn,b main\n)	pause()conn.interactive()

基于上面的利用代码,说明一下。程序是通过ld.so文件调用pwn文件,加载的libc文件通过LD_PRELOAD来定义,我们原有系统程序的ld和libc的加载关系是固定的,可以通过ldd指令查看,如图

一个程序启动需要用到ld.so和libc.so文件,调用哪个ld.so和libc.so其实在程序中是指明的。如果如果使用的ld.so和libc的版本不匹配,直接调用LD_PRELOAD是会程序崩溃的。因此,我们在使用特定版本的libc的时候,还要替换掉对应的ld.so文件。调用的形式就如代码中所说

其实到此我们的问题已经解决了,不过我们再考虑两个问题
1.对应版本的ld和libc在哪里下载?
为了解决这个问题,在github有一个很好的工具,在第二点中将详细讲解

2.程序调用哪个ld.so在程序中是明确存放的,那么理论上来如果有办法修改程序指定的ld.so,再设置LD_PRELOAD值就可以了?
是的,这样就不会崩溃了,但是我们方便用pwntools调试还是用上面代码的方法把,有个好用的工具可以修改ld.so的指向,在第三点介绍

二、glibc-all-in_one (可以到所有版本的libc和ld文件)

$ git clone 
$ cd glibc-all-in-one
$ ./update_list 		#获取可以更新的glibc的版本
$ cat list 				#查看可下载的glibc
$ ./download glibc 		#glibc为要下载glibc的名字


然后我们就可以到指定版本的所有so文件了!

三、patchelf(可以修改程序指向的ld.so)

$ sudo apt install patchelf
$ patchelf --set-interpreter 要修改的libc地址 ./pwn
$ patchelf --replace-needed libc.so.6 /home/bhxdn/glibc-all-in-one/libs/2.2-0ubuntu_amd64/libc-2.2.so ./pwn#libc.so.6为需要替换的libc路径 第二个参数是需要加载的glibc的目录    pwn 是二进制文件
$ ldd ./bin #查看elf的ld和libc

PS:我ld替换成功了,但是libc没有成功,程序也不能运行了,大佬们知道什么问题可以指点一下…

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/857345.html

相关标签:无
上传时间: 2024-02-10 12:45:55
留言与评论(共有 17 条评论)
本站网友 消息推送
2分钟前 发表
./pwn ]
本站网友 动如脱兔静如
25分钟前 发表
如果如果使用的ld.so和libc的版本不匹配,直接调用LD_PRELOAD是会程序崩溃的
本站网友 两尺八
10分钟前 发表
因此,我们在使用特定版本的libc的时候,还要替换掉对应的ld.so文件
本站网友 顺手付官网
30分钟前 发表
因此,我们在使用特定版本的libc的时候,还要替换掉对应的ld.so文件
本站网友 龟龄酒
7分钟前 发表
./pwn ]
本站网友 xx外挂
15分钟前 发表
conn = process([ ./ld-2.2.so
本站网友 电信主页
1分钟前 发表
./libc-2.2.so })pwnlib.gdb.attach(conn
本站网友 柯尼卡美能达复印机
28分钟前 发表
log_level= debug )if __name__ == __main__
本站网友 正规网上购药网站
11分钟前 发表
conn = process([ ./ld-2.2.so
本站网友 瘦身魔方
26分钟前 发表
patchelf(可以修改程序指向的ld.so) $ sudo apt install patchelf $ patchelf --set-interpreter 要修改的libc地址 ./pwn $ patchelf --replace-needed libc.so.6 /home/bhxdn/glibc-all-in-one/libs/2.2-0ubuntu_amd64/libc-2.2.so ./pwn#libc.so.6为需要替换的libc路径 第二个参数是需要加载的glibc的目录 pwn 是二进制文件 $ ldd ./bin #查看elf的ld和libc PS:我ld替换成功了,但是libc没有成功,程序也不能运行了,大佬们知道什么问题可以指点一下…
本站网友 永琪美容美发店
17分钟前 发表
./pwn ]
本站网友 热血江湖外挂
1分钟前 发表
conn = process([ ./ld-2.2.so
本站网友 bayhouse
11分钟前 发表
程序是通过ld.so文件调用pwn文件,加载的libc文件通过LD_PRELOAD来定义,我们原有系统程序的ld和libc的加载关系是固定的,可以通过ldd指令查看,如图 一个程序启动需要用到ld.so和libc.so文件,调用哪个ld.so和libc.so其实在程序中是指明的
本站网友 王娣
17分钟前 发表
conn = process([ ./ld-2.2.so
本站网友 石决明的功效与作用
25分钟前 发表
./libc-2.2.so })pwnlib.gdb.attach(conn
本站网友 男士脱发
9分钟前 发表
程序是通过ld.so文件调用pwn文件,加载的libc文件通过LD_PRELOAD来定义,我们原有系统程序的ld和libc的加载关系是固定的,可以通过ldd指令查看,如图 一个程序启动需要用到ld.so和libc.so文件,调用哪个ld.so和libc.so其实在程序中是指明的