atum大佬视频的总结


第三章 课时2  堆漏洞的利用技巧

0X01 基础知识

1、操作系统中的内存布局(Linux)

  • 内核空间&用户空间,堆、栈等;cat /proc/pid/maps
  • 要了解ELF文件结构

2、什么是堆?

  • 数据结构:父节点总大于/小于子节点的特殊的完全二叉树
  • 操作系统:程序在运行时动态申请和释放的内存空间(malloc,realloc,free,new,del等)

3、不同操作系统对堆内存有不同的管理策略,对某些软件(如浏览器)会自己实现堆内存管理

  • 多数Linux发行版(with glibc):ptmalloc/dlmalloc
  • Android/firefox:jemalloc
  • Windows:微软自己实现了一套内存管理机制
  • Linux内核:slab,slub,slob分配器

4、了解内存管理的策略是玩转堆漏洞的关键

5、CTF题中堆管理机制:大多数是ptmalloc/dlmalloc,少数题中自己实现

6、ptmalloc/dlmalloc是glibc的默认内存管理机制,了解它对PWN堆题来说至关重要!

7、强烈推荐:glibc内存管理ptmalloc源代码分析.pdf (阿里巴巴的一位工程师写的)   建议先通读,再用作工具书

8、作业:精读“glibc内存管理ptmalloc源代码分析.pdf  ”的1-27页,粗度28-130页(end)。arena,bin,chunk。Know it and pwn it!

0X02 堆溢出的利用思想与防护策略

1、堆漏洞的利用思想:

  • 破坏堆内存管理的相关数据结构:如arena、bin、chunk
  • 破坏堆内存中的用户数据:覆盖变量指针、函数指针、数据等
  • 一般情况下都是为了构造任意内存读写以及控制流劫持

2、堆漏洞的防护方法:

  • 保护堆内存管理相关的数据结构:Heap Canary、对数据结构进行加密、在堆管理代码中加入大量安全检查
  • 通用防护:ASLR、DEP
  • 以上保护机制在Win10中基本以及全部开启,但是在CTF环境中(Linux with glibc),除了通用防护以及堆管理中的安全检查,剩下的都均默认关闭或未实现

0X03 堆溢出的利用技术与技巧

1、Use After Free & Double Free

  • Dangling pointer:(悬挂指针)指向被释放的内存的指针,通常是由于释放内存后未将指针置null
  • Use After Free:对Dangling pointer所指向内存进行use,如指针解引用等。
  • Use After Free漏洞根据use的方式会产生不同的危害。
  • UAF的利用思路:想办法将Dangling pointer指向的内存重新分配回来,且尽可能的使该内存中的内容可控(如重新分配为字符串)。如果use的方式是打印*(Dangling pointer+8),那就会产生任意地址读,如果use方式是将*(Dangling pointer+12)作为函数指针进行调用,那就可以劫持控制流。
  • Double Free:UAF中的use为再次free,是一种特殊的UAF,且可转换为普通的UAF
  • 习题:
  1. UAF:Defcon CTF Qualifier 2014 shitsco、BCTF 2016:router、HCTF 2016 5-days(较难)
  2. Double Free:0CTF 2016:freenote、HCTF2016 fheap、HCTF2016 5-days(较难)
  • 作业:完成习题shitsco(writeup很多)
  • 参考阅读:
  1. http://blog.csdn.net/sdulibh/article/details/47375969
  2. http://www.tuicool.com/articles/yquU732
  3. https://blog.skullsecurity.org/2014/defcon-quals-writeup-for-shitsco-use-after-free-vuln

2、Heap Overflow

  • Overflow directly
  1. 直接覆盖相邻堆块的内存的内容
  2. 关键:如何让想被覆盖的堆块正好在具有溢出漏洞的堆块之后。
  3. 堆风水/堆排布:通过操纵内存的分配与释放,来控制堆块装内存中的相对位置。
  4. 堆排布几乎是所有堆漏洞利用所必需的技能,需要对glibc内存管理策略非常熟悉。知道什么时候分析什么内存。再次强调:一定要阅读且经常翻阅《glibc内存管理ptmalloc源代码分析.pdf》!!!
  5. 例题:XMAN2016 fengshui(zijinghua pwn),SSC安全大会百度展厅 heapcanary
  6. 作业:完成heapcanary
  7. 其实真实环境中大多数漏洞都是通过这种方式进行利用的。但是CTF中不算特别常见。因为太简单了。
  • Fast bin attack
  1. 改写fastbin单向链表中的fd,那再次分配就会分配到被改写的fd指向的地址
  2. 改写目标必须有一个正确的size对应,否则会挂
  3. CTF中的套路:如果bss上有指针,通常会改到bss的指针附近,再次分配可以分配到bss地址,修改新分配的内容便可以修改bss上的指针。
  4. 另外还有:House of spirit
  5. 例题:alictf 2016 fb(作业,推荐完成)、alictf 2016 starcraft、0ctf 2016 zerostorage(比较难)
  6. 推荐阅读:

http://www.freebuf.com/news/88660.html

http://angelboy.logdown.com/posts/291983-heap-exploitation

  • Unsorted bin attack
  1. 当需要分配的内存无法在fastbin或者smallbin找到时,glibc会从unsort bins的链表头的bk开始遍历,遍历过程中会把unsortbin中的块加入合适的smallbin/largebin中,如果找到合适大小内存块则会返回。
  2. 利用思路:
  3. 习题:0ctf2016 Zerostorage:http://brieflyx.me/2016/ctf-writeups/0ctf-2016-zerostorage(第一步unsortedbin attack改写global max fast,第二步fastbin attack)
  • Overwrite Topchunk
  1. Bin中没有任何适合的内存时会从Topchunk分配内存
  2. 改写Topchunk的size为一个很大的数,如0xffffffff,分配alloc_size-4大小的内存。由于alloc_size可控,所以此时topchunk位置可控,再次分配即可分配到想分配的位置
  3. 需要预先泄露topchunk的地址
  4. 例题:BCTF 2016 bcloud(推荐完成) 、BCTF 2016 ruin(arm结构的程序,选做)
  5. 推荐阅读:

https://gbmaster.wordpress.com/2015/06/28/x86-exploitation-101-house-of-force-jedi-overflow

http://angelboy.logdown.com/posts/291983-heap-exploitation

  • Classical & Modern Unlink Attack
  1. Unlink:当free(mem)调用时,如果与mem相邻的块是空闲的,则会将其从空闲链表中拿(unlink)下来并与men合并。
  2. 例题:

Hitcon 2014 qualifier stkof (Modern Unlink Attack 作业 推荐完成)

MMA CTF 2016 Dairy(Off by one+Classic Unlink Attack +sandbox bypass)

PlaidCTF 2014 200 ezhp (Classic Unlink Attack)(作业 推荐完成)

3.推荐阅读:

http://acez.re/ctf-writeup-hitcon-ctf-2014-stkof-or-modern-heap-overflow

  • Off by one & Off by null
  1. Off by one:溢出位数为1的溢出漏洞
  2. Off by null:溢出位数为1且溢出内容为null的溢出漏洞
  3. 在glibc中,如果攻击者可以控制malloc的大小和malloc与free的时机,堆中的Off by one和Off by null是可用的,通常可以构造UAF,进而构造任意地址读写&控制流劫持。
  4. 主要利用思路:改写下一个chunk的chunk size(including inuse bit)
  5. 作业:阅读论文《Glibc_Adventures-The_Forgotten_chunks.pdf》
  6. 习题:

Off by one:MMA CTF 2016 Dairy(Off by one + Classic Unlink Attack + sandbox bypass)

Off by null:plaid CTF 2015 datastore,XMAN 2016 Final love_letter

7.推荐阅读:

http://angelboy.logdown.com/posts/567673-advanced-heap-exploitation

  • Other techniques
  1. 改写morecore:在HCTF 2016 5-days首次出现、5-day wp.pdf
  2. House of Orange:改写_IO_list_all,在hitcon 2016首次出现。Hitcon 2016 House of orange。http://angelboy.tw
  3. 作业:完成5-day、House of Orange

3、General exploit techniques

  • Heap fengshui
  1. 高级堆排布技术
  2. 动机:真实漏洞在利用的时候,堆是混乱的,因为存在漏洞的服务可能已经服务过很多用户,在触发漏洞时无法预计堆已经做了多少次malloc多少次free。
  3. Heap fengshui可以让堆从混乱状态转换为确定状态。
  4. 不同的内存管理策略对应的heap fengshui 的方法不同
  5. CTF题目一般不需要利用这种技术,因为大多数CTF题目都是程序启动后立刻被攻击者利用,堆处于确定的状态。
  6. 例题:XMAN 2016 fengshui、33c3 CTF babyfengshui
  • Heap spray
  1. 堆喷:不断分配内存,并填充(大量0x0c)+shellcode,直到0x0c0c0c0c内存地址被分配,多用于脚本语言漏洞的利用。
  2. 大多数内存地址的值都是0x0c0c0c0c,0x0c0c0c0c地址也是0x0c slide+shellcode可以用其绕过ASLR,控制流劫持(jmp addr/jmp *addr)时,只要addr是喷过地址都可以执行shellcode,注意*addr=0x0c0c0c0c **addr=0x0c0c0c0c ***addr=0x0c0c0c0c
  3. 必须在NX关闭时才能直接利用heap spray劫持控制流
  4. 例题:pwnhub.cn calc
  5. 推荐阅读:
  6. http://www.tuicool.com/articles/3ul
  7. 主要在脚本语言中利用
  • Exploit mmap chunk
  1. CTF用的不多,不细讲
  2. 例题:Hitcon 2014 qualifier stkof
  3. 推荐阅读:0ops培训资料 Linux heap internal.pdf
  4. 适用于没有限制分配内存大小的题目。

【学习笔记】CTF PWN选手的养成(三)相关推荐

  1. numpy学习笔记:np.zeros应用——生成三通道全黑Mask(蒙版)

    numpy学习笔记:np.zeros应用--生成三通道全黑Mask(蒙板) np.zeros官方文档:np.zeros官方文档 下面是一段生成256*256三通道全黑mask的demo import ...

  2. 学习笔记(六)——JavaScript(三)

    文章目录 一.鼠标事件 1.1.鼠标移动事件(onmousemove) 1.2.鼠标按键按下与松开事件(onmousedown/onmouseup) 1.3.鼠标滚轮事件(onmousewheel) ...

  3. 【物联网学习笔记——人人学IoT系列】三、窄带无线,海量物联

    目录 1. NB-IoT 1.1 NB-IoT背景知识 1.2 NB-IoT的网络总体架构 2. NB-IoT中的Niubility技术 2.1 NB-IoT物理层 2.1.1 NB-IoT上行技术 ...

  4. Linux学习笔记---使用BusyBox创建根文件系统(三)

    目录 创建/etc/init.d/rcS 文件 创建/etc/fstab 文件 创建/etc/inittab 文件 创建/etc/init.d/rcS 文件 通过nfs加载根文件系统成功后,在串口终端 ...

  5. 【安全牛学习笔记】手动漏洞挖掘(三)

    手动漏洞挖掘 Directory travarsal / File include(有区别/没区别) 目录权限限制不严 / 文件包含 /etc/php5/cgi/php.ini allow_url_i ...

  6. 【OS学习笔记】十五 保护模式三:保护模式下的内存访问机制

    上一篇文章学习了段描述符与段描述符各个标志位的含义:段描述符 本篇文章学习如何进入保护模式,并学习如何在保护模式下进行内存访问. 1.如何进入保护模式 假设我们已经用汇编语言将段描述符安装到GDT中( ...

  7. Unity学习笔记(四)—— 制作第三个小游戏(像模像样的)

    一.创建项目,取名为HistoricalAdventure(古迹探险),导入素材 方法一:访问unity 素材网:Asset Store (unity.com),比如我们要导入一个天空的素材,我们在搜 ...

  8. python学习笔记 day15 内置函数(三)

    bin(),oct(),hex()----进制转换,将十进制分别转换成二进制,八进制和十六进制 print(bin(10)) print(oct(10)) print(hex(10)) 运行结果: a ...

  9. 学习笔记 --- 编码过程中常见的三种异步方式

    实际的编码过程中, 凡是涉及到网络通信的代码, 异步都是决不可缺少的. 那么什么是异步呢? 异步就是子线程, 异步通过开辟子线程来实现, 所以一提到异步就应该想到子线程. 即使不涉及网络通信, 异步也 ...

最新文章

  1. PPIO 商业化架构解析
  2. 数据结构 判断单链表是否有环 C
  3. STM32的时钟系统RCC详细整理
  4. C++项目参考解答:累加求圆周率
  5. 【网络通信与信息安全】之深入解析进程之间的通信方式
  6. Centos用户和用户组管理
  7. 首次构建android studio gradle 下载缓慢的问题
  8. c++ stl队列初始化_创建一个向量,并将其像C ++ STL中的数组一样初始化
  9. JDBC——概述与JDBC的使用
  10. she's gone
  11. 行业最大!黑鲨5系列将搭载5320mm²双VC散热:冰封骁龙8
  12. open jdk 证书 问题
  13. Java Web开发实战(二)—Tomcat安装及环境变量配置
  14. Atitit postgresql data type 数据类型与mysql对应表 数据库常用数据类型 Postgre Mysql 整数 intgreter Int 小数 numeric FL
  15. pyzabbix 删除触发器_Zabbix实现批量监控端口状态的方法
  16. webpack5学习与实战-(六)-babel-loader解析js文件
  17. jQuery倒计时进度条
  18. 德标螺纹规格对照表_螺栓螺母德标 欧标 国标对照表
  19. 手机自带计算机在线汇率,中美汇率换算计算器(汇率换算器在线 查询)
  20. excel中if的嵌套使用方法

热门文章

  1. python 架构师月薪_2019年IT届最火工作岗位,平均工资一万以上,很多公司还招不到人...
  2. Rhino 7.7.21160.05002 中文版 强大的3D造型软件
  3. bootstrap php三级联动,基于Bootstrap实现城市三级联动
  4. 函数 - 计算机函数
  5. 短视频app开发中,给短视频加水印的技术该如何实现
  6. LeetCode 142.环形链表||(中等)
  7. java计算机毕业设计汽车租赁系统演示录像源码+程序+lw文档+mysql数据库
  8. 苹果与 Epic 的第一战:两败俱伤!
  9. Unity 游戏中的战斗系统的架构与设计
  10. 转《JavaScript中的图片处理与合成》