HCTF-2016-fheap 堆技巧use-after-free

目录

  • 常规检查
  • 逆向分析
    • create 函数
    • delete 函数
  • 利用思路
  • 来源

常规检查

逆向分析

??题目程序较为简单,功能是创建字符串和删除字符串,其中创建字符串用 create ,删除字符串用 free 。

create 函数

??当输入的字符串大于 0xf 字符时会另外开辟内存来存储字符串,否则存入 ptr 指针的地址中。通过分析我们还可以得到

  • *ptr :在小于等于 0xf 字符时是string的地址,在大于 0xf 字符时是 dest 的指针, dest 指针指新开辟用来存储 stirng 的内存
  • *(ptr+3):这个地方存储的是 free 函数地址,当小于等于 0xf 字符时只 free 指针,当 大于 0xf 字符时 free 指针和内容,但是都没有对指针和内容置 0 ,这里就会导致 use-after-free 和 double-free 漏洞
  • *(ptr+4):存储 string 的长度。
  • (&unk_2020C0 + 2 i + 1):存储的是字符串的地址
  • (&unk_2020C0 + 4 i):通过置 1 说明第 i 个 string 已创建

??同时 create 函数 c 层面有个比较难理解的地方

??free2 是一个 void 函数,哪里来的返回值呢?我们看下汇编

lea 指令,所以这个语句的意思是将 free2 函数的起始地址赋给 *(ptr+3) 。

delete 函数

??(&unk_2020C0 + 2 i + 1) 是字符串地址,加上 24 即为 free 函数地址,所以这个语句相当于 free(string) 。同时把 (&unk_2020C0 + 4 i) 置 0 说明已经 string 删除。

利用思路

??我们首先可以构造两个小的 chunk ,并释放它们,然后 create 大于 0xf 的字符串,这样刚刚被 free 的两个 chunk 又使用到了。同时里面的拥有 free 函数的指针,我们可以覆盖这个指针,泄露出程序运行的基址。虽然程序开启了 PIE ,但是 PIE 是无法改变地址后三位的。

??注意到 call put 指令与 free2 函数地址偏移在后三位之内。我们只要把 string 内容中 free2 的地址后三位修改一下为 call put 地址,这样 delete 字符串的时候相当于运行 put 打印出字符串地址开始的内容, call put 的地址就在这串内容里,这样可以泄露程序基址。
??线路程序基址后,我们可以获得 printf_plt 的地址,重复上述步骤,利用格式化字符串可以泄露 libc 函数的地址。
??最后,根据泄露的 libc 函数地址通过偏移计算 system 与 binsh 的地址,覆盖 free2 函数指针为 system 函数即可 get shell 。

来源

2016 hctf fheap 题解

原文地址:https://www.cnblogs.com/luoleqi/p/12343147.html

时间: 2024-10-19 01:05:20

HCTF-2016-fheap 堆技巧use-after-free的相关文章

babyheap_0ctf_2017 堆技巧 fastbin-attack

目录 常规检查 逆向分析 Allocate 函数 Fill 函数 Free 函数 Dump 函数 利用思路 利用过程 get flag exp 脚本 内容来源 常规检查 逆向分析 ??程序有四个功能 Allocate:分配内存大小并给出 index Fill:输入 index ,并分配内存进行内容写入操作 Free:输入 index ,释放相应的内存空间 Dump:输入 index ,打印内容 Allocate 函数 分配的大小不能超过 4096 字节 (24LL i + a1):置 1 表示

HITCON Training lab14 magic heap 堆技巧unsroted bin attack

目录 常规检查 逆向分析 create_heap 函数 edit 函数 delete 函数 main 函数 整体思路 利用过程 拿 shell get flag exp 脚本 内容来源 常规检查 逆向分析 -------------------------------- Magic Heap Creator -------------------------------- 1. Create a Heap 2. Edit a Heap 3. Delete a Heap 4. Exit -----

【转】Darwin Streaming Server 核心代码分析

无意中看到了dqzhangp的一篇博客,分析了DSS的核心架构,读完顿时感觉豁然开朗,茅塞顿开,写得非常的鞭辟入里,言简意赅,我想没有相当的功力是写不出这样的文章的,情不自禁转到自己空间来,生怕弄丢了. 基本概念   首先,我针对的代码是Darwin StreamingServer 6.0.3未经任何改动的版本. DarwinStreaming Server从设计模式上看,采用了Reactor的并发服务器设计模式,如果对Reactor有一定的了解会有助于对DarwinStreaming Serv

Darwin Streaming Server 核心代码分析

基本概念 首先,我针对的代码是Darwin Streaming Server 6.0.3未经任何改动的版本. Darwin Streaming Server从设计模式上看,采用了Reactor的并发服务器设计模式,如果对Reactor有一定的了解会有助于对Darwin Streaming Server核心代码的理解. Reactor模式是典型的事件触发模式,当有事件发生时则完成相应的Task,Task的完成是通过调用相应的handle来实现的,对于handle的调用是由有限个数的Thread来完

考研计算机基础:构造算法与自上而下逐步完善:实例研究2

构造算法与自上而下逐步完善:实例研究2(标记控制重复) 下面将全班平均成绩问题一般化,考虑如下问题: 开发一个计算全班平均成绩的程序,在每次程序运行时处理任意个成绩数. 在第一个全班平均成绩例子中,成绩个数(10)是事先预置的.而本例中,则不知道要输入多少个成绩,程序要处理任意个成绩数.程序怎么确定何时停止输入成绩呢?何时计算和打印全班平均成绩呢? 一种办法是用一个特殊值作为标记值(sentinelvalue),也称信号值(signalvalue).哑值(dummy value)或标志值(fla

考研计算机基础while重复结构

while重复结构 重复结构(repetition strucure)使程序 员可以指定一定条件下可以重复的操作.下列伪代码语句: While there are more items on my shopping list Purchase next item and cross it off my list 描述购物过程中发生的重复.条件"there are more ltems on my shopping list"(购物清单中还有更多项目)可真可假.如果条件为true.则执行

for重复结构

for重复结构处理计数器控制循环的所有细节.要演示for的功能,可以改写图2.16的程序,结果如图2.17. 执行for重复结构时,声明控制变量counter并将其初始化为1.然后检查循环条件counter <=10.由于counter的初始值为1,因此条件满足,打印Counter的值(1).然后在表达式Counter++中递增控制变量counter,再次进行循环和测试循环条件.由于这时控制变量等于2,没有超过最后值,因此程序再次执行语句体.这个过程一直继续,直到控制变量counter递增到11

聊一聊前端模板与渲染那些事儿

欢迎大家收看聊一聊系列,这一套系列文章,可以帮助前端工程师们了解前端的方方面面(不仅仅是代码): https://segmentfault.com/blog/frontenddriver 作为现代应用,ajax的大量使用,使得前端工程师们日常的开发少不了拼装模板,渲染模板.我们今天就来聊聊,拼装与渲染模板的那些事儿. 如果喜欢本文请点击右侧的推荐哦,你的推荐会变为我继续更文的动力 1 页面级的渲染 在刚有web的时候,前端与后端的交互,非常直白,浏览器端发出URL,后端返回一张拼好了的HTML串

使用 Raspberry Pi 上的传感器在 Node.js 中创建一个 IoT Bluemix 应用程序

先决条件 一个IBM Bluemix 帐号,一个 Raspberry Pi 2 或 3,一个 PIR 运动传感器 适用于本文的 Github 存储库 如果您是一位精明的 Bluemix 开发人员,您可能只想看看如何在 node.js 中与 IoT 建立连接,或者只想了解如何从此 github 存储库中拉取我的代码. git clone https://github.com/nicolefinnie/iot-nodejs-tutorial 以下是实现与 IBM IoT 平台连接在一起的 4 个 R