概述:

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)大小的设定需要满足以下两点:

  1. 必须是2的幂
  2. 必须是void *的整数倍

所以top_chunk需要移动的距离如果不满足这两个条件的话就要简单的修改一下,就像前面的例子里一样。

然后就是这个利用手法需要的条件:

  1. 能够以溢出等方式控制到 top chunk 的 size 域
  2. 能够自由地控制堆分配尺寸的大小

House of Force相关推荐

  1. innodb force recovery

    innodb force recovery的6种设置: 1.innodb force recovery=1,即使发现了损坏页面也继续让服务器继续运行,这个选项对于备份或者转存当前数据尤为有用 2.in ...

  2. Go 语言实现字符串匹配算法 -- BF(Brute Force) 和 RK(Rabin Karp)

    今天介绍两种基础的字符串匹配算法,当然核心还是熟悉一下Go的语法,巩固一下基础知识 BF(Brute Force) RK(Rabin Karp) 源字符串:src, 目标字符串:dest: 确认des ...

  3. Brute Force算法介绍及C++实现

    字符串的模式匹配操作可以通过Brute Force算法来实现.字符串匹配操作即是查看S串(目标串或主串)中是否含有T串(模式串或子串),如果在主串中查找到了子串,则模式匹配成功,返回模式串中的第一个字 ...

  4. gpupdate /force 遇报错解决过程

    windows server 2008 修改策略后,需要更新.在cmd中执行 gpupdate /force,遇到报错.报错内容为 The processing of Group Policy fai ...

  5. MySQL force Index 强制索引概述

    以下的文章主要介绍的是MySQL force Index  强制索引,以及其他的强制操作,其优先操作的具体操作步骤如下:我们以MySQL中常用的hint来进行详细的解析,如果你是经常使用Oracle的 ...

  6. SpriteBuilder实际操作中如何确定合适Breaking force的值

    确定Breaking force合适的值同样很单调,但是按照下面的方法也并不是完全不可能: 输入一个随意的值,比如说100 检查实际场景中关节是否能承受住物理物体,在完美的情况下物理物体将保持静止. ...

  7. mysql ignore index_mysql use index、ignore index、force index用法

    原创你去了哪里 最后发布于2019-10-18 14:05:48 阅读数 121  收藏 展开 1:use index:在你查询语句表名的后面,添加use index来提供你希望mysql去参考的索引 ...

  8. mysql日常错误信息解决方法:InnoDB: and force InnoDB to continue crash recovery here.

    今天早上上班来打开环境,mysql报了这个错误,猜到的原因应该是昨天晚上下班没等mysql服务器退出就关闭计算机. 2014-05-09 09:44:25 4128 [ERROR] InnoDB: A ...

  9. 利用 force index优化sql语句性能

    今天写了一个统计sql,在一个近亿条数据的表上执行,200s都查不出结果.SQL如下: select customer,count(1) c from upv_** where created bet ...

  10. 明明表中有这个索引,但mysql的force index 无效?

    一.前言 最近在写sql的时候,会格外注意一些sql的优化,针对复杂的sql,优化器使用的方案并不是最佳方案,所以可能需要我们使用force index这种方式来自己选择索引,加快查询速度.这次记录一 ...

最新文章

  1. 赠书 | GNN 模型在生物化学和医疗健康中的典型应用
  2. 构造函数,实例,原型,以及原型链
  3. [Sensor]--BMI160-加速度计、陀螺仪传感器
  4. 发布一个自己开发的网站
  5. 用户和组相关的配置文件总结
  6. c++的文件输入/输出
  7. hdu5424 Rikka with Graph II
  8. 基于ConvLSTM的伦敦空气质量预测(1) 数据处理
  9. rk3399_android10编译说明
  10. ExtJS002Window创建
  11. Python工作任务自动化教程
  12. 计算机语言缩写 dos,dos是什么意思 dos缩写中英全称是什么
  13. 将本地项目上传到码云
  14. your cuda software stack is old.we fall back to the NIVIDIA driver for some compilation. Update your
  15. android系统应用开发常用的adb命令个人收藏集锦(不断更新)
  16. 2022-2028全球植物生长帐篷行业调研及趋势分析报告
  17. 1-4 Linux 标准目录结构FHS
  18. 蓝桥杯练习(第二十三天)
  19. 基于asp.net的共享单车管理系统的设计与实现
  20. openKylin实现国产X86平台支持,成功适配兆芯、海光

热门文章

  1. 大一计算机基础ppt练习题,大学计算机基础练习题.ppt
  2. 交换机MAC地址表管理
  3. DMS、RDS、OLAP简介
  4. mysql中findinset函数的使用
  5. 为什么大公司不喜欢用第三方框架?难道是因为……
  6. SimpleDateFormat 参数
  7. Wireshark抓包分析TCP的三次握手
  8. 实战web漏洞挖掘小技巧
  9. 2019全国数学建模总结
  10. 2019全国数学建模比赛总结