House of Force
概述:
house of force是一种针对top chunk的利用手法,它是通过修改top_chunk的size域从而完成一次几乎是任意地址的内存分配
原理:
根据前面的堆的基础知识可以知道,当程序需要分配一块内存,而tcache或者各个bin中都没有对应大小的堆块的话就会从top_chunk中分割一个对应大小的chunk出来给我们用,但是如果我们可以控制top_chunk的size域话,我们只需要在分配时用些小手段就可以将top_chunk分配到任意一个地址上去。
首先我们来看一下分割top_chunk时的操作和检查:
// 获取当前的top chunk,并计算其对应的大小
victim = av->top; //获取top_chunk地址
size = chunksize(victim); //获取top_chunk大小
// 如果在分割之后,其大小仍然满足 chunk 的最小大小,那么就可以直接进行分割。
if ((unsigned long) (size) >= (unsigned long) (nb + MINSIZE))
{remainder_size = size - nb; //分配后的大小remainder = chunk_at_offset(victim, nb); //分配后top_chunk的地址av->top = remainder;//下面的两个set是跟完成分配后的top_chunk和分割出去的chunk设置chunk_header的流程,这里不用管set_head(victim, nb | PREV_INUSE |(av != &main_arena ? NON_MAIN_ARENA : 0));set_head(remainder, remainder_size | PREV_INUSE);check_malloced_chunk(av, victim, nb);void *p = chunk2mem(victim);alloc_perturb(p, bytes);return p;
}
可以看见在流程中只有一个检查,就是这一句判断:
if ((unsigned long) (size) >= (unsigned long) (nb + MINSIZE))
判断top_chunk现在的size是否比需要分割出去的chunk的size大,这里加的 MINSIZE 是要保证即使top_chunk的大小比需要的大小大,但是分配完成后还要保证有一个MINSIZE大小的内存来存放top_chunk的chunk_header。
那么这个判断想要绕过也很简单,只需要让top_chunk的size很大就行了,这里可以发现在进入判断时会把size强行转换为无符号长整型,所以,这里我们如果能将其设置为-1,在转换后就会变成无符号整形里最大的数(0xffffffffffffffff)就可以绕过判断了
示例:
这里采用wiki上的第一个例子来看一下house of force的流程:
这个例子是要篡改malloc函数got表地址的内存
int main()
{long *ptr,*ptr2;ptr=malloc(0x10);ptr=(long *)(((long)ptr)+24);*ptr=-1; // <=== 这里把top chunk的size域改为0xffffffffffffffffmalloc(-4120); // <=== 减小top chunk指针malloc(0x10); // <=== 分配块实现任意地址写
}
程序流程比较简单就不赘述了,这里讲一下为什么要在修改top_chunk的size位后分配一个大小为-4120的chunk:
因为我们要控制malloc的got表处的内存,在gdb中可以查到他的got表所在的地址是:0x601020
然后top_chunk的地址是:0x602020
所以我们要让top_chunk的地址向上移 0x601010 - 0x602020= -4112,这里由于要经过内部的checked_request2size,所以我们是要满足对齐参数MALLOC_ALIGN(详细的解释可以看wiki,后面总结的时候会再提一下),所以最终是要减去一个-4120。
之后我们进入gdb看一下流程:
首先将断点下在第10行看一下top_chunk的size被修改后的情况:
已经修改成功了,之后步进下一步分配走那个0x4120大小的chunk让top_chunk来到malloc的got表地址位置上的内存:
可以看见已经被分配出来了,之后我们只要再次申请申请堆块就可以控制修改malloc的got表内容了。
总结:
house of force这个手法的原理和操作都比较简单,位移比较需要考虑的点就是修改top_chunk的size之后怎么将地址转移到目标地址处,首先要知道64位的操作系统下所有chunk都需要一个0x10的空间存放chun_header 所以我们可以有一下这个公式:
最终目标地址 = 需要控制的地址- 0x10
top_chunk需要移动的距离 = 最终目标地址 - top_chunk的地址
这里得到的top_chunk需要移动的距离由于要通过request2size,就需要满足对齐参数MALLOC_ALIGN 实际上,对齐参数(MALLOC_ALIGNMENT)大小的设定需要满足以下两点:
- 必须是2的幂
- 必须是void *的整数倍
所以top_chunk需要移动的距离如果不满足这两个条件的话就要简单的修改一下,就像前面的例子里一样。
然后就是这个利用手法需要的条件:
- 能够以溢出等方式控制到 top chunk 的 size 域
- 能够自由地控制堆分配尺寸的大小
House of Force相关推荐
- innodb force recovery
innodb force recovery的6种设置: 1.innodb force recovery=1,即使发现了损坏页面也继续让服务器继续运行,这个选项对于备份或者转存当前数据尤为有用 2.in ...
- Go 语言实现字符串匹配算法 -- BF(Brute Force) 和 RK(Rabin Karp)
今天介绍两种基础的字符串匹配算法,当然核心还是熟悉一下Go的语法,巩固一下基础知识 BF(Brute Force) RK(Rabin Karp) 源字符串:src, 目标字符串:dest: 确认des ...
- Brute Force算法介绍及C++实现
字符串的模式匹配操作可以通过Brute Force算法来实现.字符串匹配操作即是查看S串(目标串或主串)中是否含有T串(模式串或子串),如果在主串中查找到了子串,则模式匹配成功,返回模式串中的第一个字 ...
- gpupdate /force 遇报错解决过程
windows server 2008 修改策略后,需要更新.在cmd中执行 gpupdate /force,遇到报错.报错内容为 The processing of Group Policy fai ...
- MySQL force Index 强制索引概述
以下的文章主要介绍的是MySQL force Index 强制索引,以及其他的强制操作,其优先操作的具体操作步骤如下:我们以MySQL中常用的hint来进行详细的解析,如果你是经常使用Oracle的 ...
- SpriteBuilder实际操作中如何确定合适Breaking force的值
确定Breaking force合适的值同样很单调,但是按照下面的方法也并不是完全不可能: 输入一个随意的值,比如说100 检查实际场景中关节是否能承受住物理物体,在完美的情况下物理物体将保持静止. ...
- mysql ignore index_mysql use index、ignore index、force index用法
原创你去了哪里 最后发布于2019-10-18 14:05:48 阅读数 121 收藏 展开 1:use index:在你查询语句表名的后面,添加use index来提供你希望mysql去参考的索引 ...
- mysql日常错误信息解决方法:InnoDB: and force InnoDB to continue crash recovery here.
今天早上上班来打开环境,mysql报了这个错误,猜到的原因应该是昨天晚上下班没等mysql服务器退出就关闭计算机. 2014-05-09 09:44:25 4128 [ERROR] InnoDB: A ...
- 利用 force index优化sql语句性能
今天写了一个统计sql,在一个近亿条数据的表上执行,200s都查不出结果.SQL如下: select customer,count(1) c from upv_** where created bet ...
- 明明表中有这个索引,但mysql的force index 无效?
一.前言 最近在写sql的时候,会格外注意一些sql的优化,针对复杂的sql,优化器使用的方案并不是最佳方案,所以可能需要我们使用force index这种方式来自己选择索引,加快查询速度.这次记录一 ...
最新文章
- 赠书 | GNN 模型在生物化学和医疗健康中的典型应用
- 构造函数,实例,原型,以及原型链
- [Sensor]--BMI160-加速度计、陀螺仪传感器
- 发布一个自己开发的网站
- 用户和组相关的配置文件总结
- c++的文件输入/输出
- hdu5424 Rikka with Graph II
- 基于ConvLSTM的伦敦空气质量预测(1) 数据处理
- rk3399_android10编译说明
- ExtJS002Window创建
- Python工作任务自动化教程
- 计算机语言缩写 dos,dos是什么意思 dos缩写中英全称是什么
- 将本地项目上传到码云
- your cuda software stack is old.we fall back to the NIVIDIA driver for some compilation. Update your
- android系统应用开发常用的adb命令个人收藏集锦(不断更新)
- 2022-2028全球植物生长帐篷行业调研及趋势分析报告
- 1-4 Linux 标准目录结构FHS
- 蓝桥杯练习(第二十三天)
- 基于asp.net的共享单车管理系统的设计与实现
- openKylin实现国产X86平台支持,成功适配兆芯、海光