博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CTF内存高级利用技术
阅读量:5115 次
发布时间:2019-06-13

本文共 1053 字,大约阅读时间需要 3 分钟。

起了一个比较屌的标题,233。想写这篇文章主要是看了kelwya分析的议题,于是准备自己动手实践一下。蓝莲花的选手真的是国际大赛经验丰富,有很多很多的思路和知识我完全都没有听说过。这篇文章会写一些不常见但是确实出现过Pwn解题思路。

1.fastbin的第三种方式?

我们知道fastbin一般有两种利用方式,通过这两种利用可以实现任意地址分配堆。现在来谈一谈第三种利用方式

  • 概述:基本思路是通过覆写一些值,使本来不在fastbin范围的堆块也被作为fastbin被处理
  • 原理:fastbin在32位下被规定为16~64,在64位下被规定为32~128。但是事实上这个值由一个被称为global_max_fast全局变量控制。只有能够覆写这个全局变量就可以实现让本来不在fastbin范围的堆块被当作fastbin块处理
  • 步骤:
    1. 通过任意地址写,覆写global_max_fast为一个很大的值
    2. 分配两个堆块(大于64byte)
    3. 释放掉高地址的堆块
    4. 通过低地址处的堆块溢出掉高地址堆块的fd指针
    5. 连续分配两次堆块
  • 效果:实现任意大小chunk的任意地址堆分配
  • 实例:PlaidCTF 2014的datastore、HITCON 2015的fooddb、0CTF 2016的Zerostorage
  • Demo:

2.基于堆的off by one

堆的off by one是指当向一个堆块中写入时,因为没有考虑好大小问题。导致一个空字节覆盖到下一个堆块的头部。发生这种情况的原因通常是复制一个字符串到一块堆内存时,如果字符串和堆的大小正好相等,那么就会发生off by one。

  • 概述:一个'\x00'字节溢出导致覆盖掉下一个堆头的size域的最低一个字节。  
  • 原理:堆分配时,往往会少分配4个字节(32位下)。比如用户申请1020个字节,如果按照常理应该是分配1028个字节的,但是实际上却只分配了1024个字      节。1024个字节装不下1028个字节的内容,所以要借用下一个块的prev_size结构的四个字节。这个也就是为什么说,当前一个空闲时,prev_size是前一块的大  小,当前一块使用时,pre_size是前一块的结尾内容。因为这种特殊的内存分配导致了off by one多出的一个'\x00'字节可以覆盖到下一块的size域。
  • 利用:这种漏洞可以导致各种各样、花式花样的overlap

 

3.待续

转载于:https://www.cnblogs.com/Ox9A82/p/5925279.html

你可能感兴趣的文章
博弈论 从懵逼到入门 详解
查看>>
永远的动漫,梦想在,就有远方
查看>>
springboot No Identifier specified for entity的解决办法
查看>>
慵懒中长大的人,只会挨生活留下的耳光
查看>>
"远程桌面连接--“发生身份验证错误。要求的函数不受支持
查看>>
【BZOJ1565】 植物大战僵尸
查看>>
VALSE2019总结(4)-主题报告
查看>>
浅谈 unix, linux, ios, android 区别和联系
查看>>
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>
中国烧鹅系列:利用烧鹅自动执行SD卡上的自定义程序(含视频)
查看>>
Solaris11修改主机名
查看>>
latex for wordpress(一)
查看>>
如何在maven工程中加载oracle驱动
查看>>
Flask 系列之 SQLAlchemy
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>
一句话说清分布式锁,进程锁,线程锁
查看>>
python常用函数
查看>>
FastDFS使用
查看>>
服务器解析请求的基本原理
查看>>