unlink是链表中常见的操作,而我们需要利用这个过程


通过改变链表指针,使中间堆块拿出来


当前的unlink会有一个对链表的完整性检查的

// 由于 P 已经在双向链表中,所以有两个地方记录其大小,所以检查一下其大小是否一致(size检查)
if (__builtin_expect (chunksize(P) != prev_size (next_chunk(P)), 0))      \malloc_printerr ("corrupted size vs. prev_size");               \// 检查 fd 和 bk 指针(双向链表完整性检查)
if (__builtin_expect (FD->bk != P || BK->fd != P, 0))                      \malloc_printerr (check_action, "corrupted double-linked list", P, AV);  \// largebin 中 next_size 双向链表完整性检查 if (__builtin_expect (P->fd_nextsize->bk_nextsize != P, 0)              \|| __builtin_expect (P->bk_nextsize->fd_nextsize != P, 0))    \malloc_printerr (check_action,                                      \"corrupted double-linked list (not small)",    \P, AV);

检查其 fd,bk 是否是指向正确的堆块, 还有一个是size检查

绕过上述的链表完整性检查需要以下操作


要利用unlink首先要绕过前面提到的两个检查。绕过size检查需要可以修改下一个chunk->prev_size。绕过fd和bk检查需要能够控制fd和bk。

1.第一种利用思路

利用条件

存在UAF可以修改p的fd和bk
存在一个指针指向p

利用方法

通过UAF漏洞修改chunk0->fd=G_ptr-0x18,chunk0->bk=G_ptr-0x10,绕过fd和bk检查
free下一个chunk,chunk0和chunk1合并,chunk0发生unlink,修改了G_ptr的值

效果

修改G_ptr=&G_ptr-0x18。如果能够对G_ptr指向的空间进行修改,则可能导致任意地址读写。

2.第二种方法思路

这种情况在做题中出现的情况比较多。因为malloc是返回的指针如果存储在bss段或者heap中则正好满足利用条件2。

利用条件

可以修改p的下一个chunk->pre_size和inuse位
存在一个指针指向chunk p的内容部分

利用方法

伪造fake_chunk。fakechunk->size=chunk0-0x10,可以绕过size检查。fakechunk->fd=&G_ptr-0x18,fakechunk->bk=&G_ptr-0x10,绕过fd和bk检查。
修改下一个chunk的prev_size=chunk_size-0x10。因为fake_chunk比chunk0小0x10。
修改下一个chunk的inuse位。
free下一个堆块chunk1。fake_chunk和chunk1合并,fakechunk发生unlink,修改了G_ptr的值。

效果

修改G_ptr=&G_ptr-0x18。如果能够对G_ptr指向的空间进行修改,则可能导致任意地址读写。

这个修改是对于X64下的偏移

对于X32的话除以2

即 ptr- 0xc

ptr-0x8

CTF(pwn) 堆利用 之 unlink 介绍相关推荐

  1. CTF(pwn)堆利用 之 off by one

    简介 利用思路

  2. linux 堆溢出 pwn 指南,新手科普 | CTF PWN堆溢出总结

    学习汇总 序言 自从加入RTIS交流群, 在7o8v师傅,gd大佬的帮助下,PWN学习之路进入加速度.下面是八周学习的总结,基本上是按照how2heap路线走的.由于八周内容全写,篇幅太长,这里只讲述 ...

  3. [pwn][堆利用]house of spirit[例题:lctf2016_pwn200]

    House of spirit 实现目的 malloc分配到目标地址 实现条件 free的参数可控 目标地址可以连续构造两个fake chunk的size域,需要地址对齐(即目标高低地址处均有可控区域 ...

  4. CTF pwn中利用pwntools加载不同版本libc调试程序的方法

    在网上找到了很多加载libc的帖子,终于自己走通了一次,现在把方法和资源都整理一下 一.解决方案 python利用pwntools的代码 from pwn import * import pwnlib ...

  5. [pwn]堆:unlink绕过,0CTF2015 freenote详解

    [pwn]堆:2free=unlink绕过,0CTF2015 freenote 题目地址,提取码:f0xd 拿到题目,国际惯例,首先查看安全策略; 没有开启PIE和full partial.然后查看程 ...

  6. 【CTF资料-0x0002】PWN简易Linux堆利用入门教程by arttnba3

    [CTF资料-0x0002]简易Linux堆利用入门教程by arttnba3 老生常谈,[GITHUB BLOG ADDR](https://arttnba3.cn/2021/05/10/NOTE- ...

  7. CTF pwn题堆入门 -- Unsorted bin

    Unsorted bin 序言 概述 攻击方式 unlink 释放Chunk到Unsorted bin House of Orange House of einherjar Unsorted bin ...

  8. pwn题堆利用的一些姿势 -- IO_FILE

    IO_FILE 概述 IO_FILE结构介绍 利用_fileno字段 原理分析 一个例子 利用IO_FILE进行leak 原理分析 一个例子 FSOP 原理分析 一个例子 总结 pwn题堆利用的一些姿 ...

  9. pwn题堆利用的一些姿势 -- free_hook

    free_hook 概述 初级必备姿势 常规搭配姿势 按需进阶姿势 总结 pwn题堆利用的一些姿势 – malloc_hook pwn题堆利用的一些姿势 – IO_FILE pwn题堆利用的一些姿势 ...

最新文章

  1. [转]C# 2.0新特性与C# 3.5新特性
  2. SAP QM QS41 试图维护Catalog为3的Code Group, 报错-You need to maintain catalog 3 (Usage Decisions) in Customi
  3. 51nod1228 序列求和(伯努利数)
  4. linux shell mv 文件 文件夹移动重命名 命令
  5. 时间同步-ntp服务器的搭建(docker版本)
  6. Spring context:component-scan代替context:annotation-config
  7. 优化SQL步骤——查看SQL执行频率 || 定位低效率执行SQL
  8. wifi的基础知识及原理1
  9. python百度网盘_百度网盘突然大调整,网友炸了..
  10. Nginx server_name正则表达式匹配配置
  11. 【CodeForces - 574D】Bear and Blocks (dp,思维)
  12. Spark Mlib TFIDF源码详读 笔记
  13. 五角数 Exercise06_01
  14. 外层div自动撑大为什么没有最大_在工业自动化行业,为什么电阻触摸屏更受欢迎...
  15. linux rvm,RVM 实用指南
  16. 微信小程序云开发教程-微信小程序的JS基础-常用的回调函数
  17. [CSS]CSS浮动float详解(三):清除浮动方案
  18. 湖北武汉施工员报考排给水和电气的施工方法建筑七大员报考
  19. 如何找到算法的时间复杂度
  20. 树莓派40pin管脚图

热门文章

  1. 0121 - 开始学习 EOS 编程
  2. 向大家推荐一个.Net游戏引擎:Artificial Engines
  3. 微信支付开发(2) 微信支付账号体系
  4. C++默认构造函数的一点说明
  5. js 1 声明变量 数据类型
  6. MongoDB入门简单介绍
  7. 图解Oracle 11g physical standby Rolling Upgrade物理备库滚动升级特性
  8. JDBC+Servlet+JSP整合开发之22.JSP简介
  9. 学习asp.net ajax 笔记(一)
  10. 过去式加ed的发音_过去式的变化规律,掌握诀窍了吗?