CTF pwn中利用pwntools加载不同版本libc调试程序的方法
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组装电脑配置单推荐报价格
上传时间: 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其实在程序中是指明的 |