CTF(pwn) 堆利用 之 unlink 介绍
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 介绍相关推荐
- CTF(pwn)堆利用 之 off by one
简介 利用思路
- linux 堆溢出 pwn 指南,新手科普 | CTF PWN堆溢出总结
学习汇总 序言 自从加入RTIS交流群, 在7o8v师傅,gd大佬的帮助下,PWN学习之路进入加速度.下面是八周学习的总结,基本上是按照how2heap路线走的.由于八周内容全写,篇幅太长,这里只讲述 ...
- [pwn][堆利用]house of spirit[例题:lctf2016_pwn200]
House of spirit 实现目的 malloc分配到目标地址 实现条件 free的参数可控 目标地址可以连续构造两个fake chunk的size域,需要地址对齐(即目标高低地址处均有可控区域 ...
- CTF pwn中利用pwntools加载不同版本libc调试程序的方法
在网上找到了很多加载libc的帖子,终于自己走通了一次,现在把方法和资源都整理一下 一.解决方案 python利用pwntools的代码 from pwn import * import pwnlib ...
- [pwn]堆:unlink绕过,0CTF2015 freenote详解
[pwn]堆:2free=unlink绕过,0CTF2015 freenote 题目地址,提取码:f0xd 拿到题目,国际惯例,首先查看安全策略; 没有开启PIE和full partial.然后查看程 ...
- 【CTF资料-0x0002】PWN简易Linux堆利用入门教程by arttnba3
[CTF资料-0x0002]简易Linux堆利用入门教程by arttnba3 老生常谈,[GITHUB BLOG ADDR](https://arttnba3.cn/2021/05/10/NOTE- ...
- CTF pwn题堆入门 -- Unsorted bin
Unsorted bin 序言 概述 攻击方式 unlink 释放Chunk到Unsorted bin House of Orange House of einherjar Unsorted bin ...
- pwn题堆利用的一些姿势 -- IO_FILE
IO_FILE 概述 IO_FILE结构介绍 利用_fileno字段 原理分析 一个例子 利用IO_FILE进行leak 原理分析 一个例子 FSOP 原理分析 一个例子 总结 pwn题堆利用的一些姿 ...
- pwn题堆利用的一些姿势 -- free_hook
free_hook 概述 初级必备姿势 常规搭配姿势 按需进阶姿势 总结 pwn题堆利用的一些姿势 – malloc_hook pwn题堆利用的一些姿势 – IO_FILE pwn题堆利用的一些姿势 ...
最新文章
- [转]C# 2.0新特性与C# 3.5新特性
- SAP QM QS41 试图维护Catalog为3的Code Group, 报错-You need to maintain catalog 3 (Usage Decisions) in Customi
- 51nod1228 序列求和(伯努利数)
- linux shell mv 文件 文件夹移动重命名 命令
- 时间同步-ntp服务器的搭建(docker版本)
- Spring context:component-scan代替context:annotation-config
- 优化SQL步骤——查看SQL执行频率 || 定位低效率执行SQL
- wifi的基础知识及原理1
- python百度网盘_百度网盘突然大调整,网友炸了..
- Nginx server_name正则表达式匹配配置
- 【CodeForces - 574D】Bear and Blocks (dp,思维)
- Spark Mlib TFIDF源码详读 笔记
- 五角数 Exercise06_01
- 外层div自动撑大为什么没有最大_在工业自动化行业,为什么电阻触摸屏更受欢迎...
- linux rvm,RVM 实用指南
- 微信小程序云开发教程-微信小程序的JS基础-常用的回调函数
- [CSS]CSS浮动float详解(三):清除浮动方案
- 湖北武汉施工员报考排给水和电气的施工方法建筑七大员报考
- 如何找到算法的时间复杂度
- 树莓派40pin管脚图
热门文章
- 0121 - 开始学习 EOS 编程
- 向大家推荐一个.Net游戏引擎:Artificial Engines
- 微信支付开发(2) 微信支付账号体系
- C++默认构造函数的一点说明
- js 1 声明变量 数据类型
- MongoDB入门简单介绍
- 图解Oracle 11g physical standby Rolling Upgrade物理备库滚动升级特性
- JDBC+Servlet+JSP整合开发之22.JSP简介
- 学习asp.net ajax 笔记(一)
- 过去式加ed的发音_过去式的变化规律,掌握诀窍了吗?