堆溢出 —— unlink | PWN

2022-08-31 10:16:20 浏览数 (1)

前几天,我们发了一篇 Ubuntu 16.04 配置 pwn 环境的文章,遭到了部分朋友的反感,他们认为我们不应该写这么基础的东西,甚至有几个朋友怒而取关了 其实那篇文章就是为了这个视频来做铺垫的,免得一些兄弟原理懂了,实践不了 所以,如果这个视频有帮助到各位,帮我们转发转发,告知一下取关的几位朋友,都是误会嗷

【B站在线观看】

https://www.bilibili.com/video/BV1uF41177YY?share_source=copy_web

【视频、图示以及文档下载地址】

https://pan.baidu.com/s/1Ps2uKajjLP6s6rqzepZEXw 提取码: 1udc

下面是视频中的 markdown 文档,方便大家学习和复制

unlink 漏洞

堆基础知识

  • Linux堆内存管理深入分析上 https://introspelliam.github.io/2017/09/10/pwn/Linux堆内存管理深入分析上/
  • Linux堆内存管理深入分析下 https://introspelliam.github.io/2017/09/15/pwn/Linux堆内存管理深入分析下/

unlink 知识

  • wooyun-drops_Linux堆溢出漏洞利用之unlink https://wooyun.js.org/drops/Linux堆溢出漏洞利用之unlink.html
  • wooyun-drops_堆溢出的unlink利用方法 https://wooyun.js.org/drops/堆溢出的unlink利用方法.html
  • ctf-wiki_unlink https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/implementation/basic/?h=unlink#unlink
  • [Unlink] 2014-HITCON-stkof | LiuLian http://liul14n.top/2020/02/03/Unlink-2014-HITCON-stkof/

内存分布图

系统内存分布图

malloc & mmap

free

chunk 的结构

  • allocated chunk;

img

  • free chunk;

img

bins

  • fastbins 0x10-0x80
  • bins
    • unsorted bins
    • small bins
    • large bins

img

感受 bins

magicheap https://github.com/bash-c/pwn_repo/tree/master/HITCON/hitconTraining_magicheap

  • fastbins 范围
  • small bins
  • large bins
  • free_unlink
  • unsortedbins
  • fd
  • bk
  • top_chunk

unlink

代码语言:javascript复制
/*unlink操作的实质就是:将P所指向的chunk从双向链表中移除,这里BK与FD用作临时变量*/
#define unlink(P, BK, FD) {                                            
    B = P->fd;                                   
    A = P->bk;                                   
    B->bk = A;                                  
    A->fd = B;                                  
    ...
}

img

unlink 问题分析

glibc 无法识别 chunk 结构

代码语言:javascript复制
B->bk != P || A->fd != P
  
P -> fd = *P - 0x18
P -> bk = *P - 0x10

B -> bk = *P - 0x18   0x18 = *P
A -> fd = *P - 0x10   0x10 = *P
  
B = P->fd;                                   
A = P->bk;    

B->bk = A;                                  
*P = *P - 0x10 

A->fd = B;
*P = *P - 0x18

unlink 漏洞结果

我们可以向某一个内存地址写入一些内容

解决一些问题

  • 伪造fd, bk
  • *P 0x6020c8
  • system() 的地址 通过show函数来获取

例题

hitconTraining_unlink——bamboobox https://github.com/bash-c/pwn_repo/tree/master/HITCON/hitconTraining_unlink

0 人点赞