堆溢出——unlink漏洞攻击(bamboobox)

news/2024/4/28 10:34:01/文章来源:https://blog.csdn.net/fzucaicai/article/details/129705468

题目自取:

链接:https://pan.baidu.com/s/1S9xbAWhFw0xFqFyQTACqLA?pwd=vvud 
提取码:vvud

介绍:

终于学到Unlink了,不得不说和栈的难度相比确实大了很多,学起来确实很淦,一个unlink漏洞也确实花了我不少时间,稍加整理写一个博客

什么时候可以用到unlink漏洞攻击,需要满足什么条件? 

1. glibc的版本不能过高,我用的是glibc 2.23版本的,glibc2.26之前的版本都是存在unlink漏洞的
2.堆溢出漏洞。可以写到上一个chunk的size位
3.可以自由创建堆,且自由创建的堆在内存上是物理相邻的

漏洞原理:

先大概看看,一会儿在构造假chunk的时候还会再分析

/* Take a chunk off a bin list */
#define unlink(AV, P, BK, FD) {                                            FD = P->fd;                               BK = P->bk;//检查p和其前后的chunk是否构成双向链表if (__builtin_expect (FD->bk != P || BK->fd != P, 0))           malloc_printerr (check_action, "corrupted double-linked list", P, AV);  else {                            FD->bk = BK;                           BK->fd = FD;//一般的unlink到这里就结束了,只有是large bin范围,才继续执行下面的代码。//如果 p 在largebin的范围  且 p->fd_nextsize不为空if (!in_smallbin_range (P->size) && __builtin_expect (P->fd_nextsize != NULL, 0)) {//检查p和其前后的large chunk的nextsize域是否构成双向链表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);  if (FD->fd_nextsize == NULL) {                if (P->fd_nextsize == P)                  FD->fd_nextsize = FD->bk_nextsize = FD;           else {                         FD->fd_nextsize = P->fd_nextsize;              FD->bk_nextsize = P->bk_nextsize;              P->fd_nextsize->bk_nextsize = FD;              P->bk_nextsize->fd_nextsize = FD;              }                            }else {                         P->fd_nextsize->bk_nextsize = P->bk_nextsize;           P->bk_nextsize->fd_nextsize = P->fd_nextsize;           }                               }                               }                                  
}

这就是当调用free函数时,系统就会取寻找相邻堆块是否已经被释放了,如果被释放的话,会进行合并操作,并且指向先前就被释放的chunk的指针会指向新释放的chunk(指向的位置被修改,这一步很危险),而在2.23glibc中存在漏洞,可以修改先前被释放的指针的指向其他地方,实现任意地址写的操作。

具体而言就是写入假的chunk绕过检查,具体的会在题目讲解时提到

开始:

这里推荐用ubuntu低版本打,我用20.04更换glibc攻击的时候经常报错,而且很难找到问题,浪费很多时间

首先查看保护措施,哦提一嘴,这题用unlink漏洞就是改got表,修改某函数的got指向system函数,再传入'/bin/sh'拿到shell
 

IDA里是什么内容就不说了,其他博客讲得很清楚,我重点谈谈构造fake_chunk我的理解
想要合并空闲的chunk,系统会进行检查
1.首先检查被合并的chunk的大小是否正确,程序会先检查被合并的chunk的size是否与其物理相连的下一个chunk的presize是否相符。

2.则是我们此次的重点,unlink检查

#define unlink(AV, P, BK, FD) {                                            FD = P->fd;                               BK = P->bk;//检查p和其前后的chunk是否构成双向链表if (__builtin_expect (FD->bk != P || BK->fd != P, 0))           malloc_printerr (check_action, "corrupted double-linked list", P, AV);  else {                            FD->bk = BK;                           BK->fd = FD;

这里的P就是指向要被合并的chunk的指针(之前我一直理解错,浪费了很多时间)
具体原理在这里不做太多解释,很多博客讲得很好

看看题目

首先我们要找到存储这些堆的指针的地址(也就是指向这些chunk的指针的地址)
 

比如这里 ,在add_item函数这里,可以看到的是,itemlist结构体数组里存的就是申请到的chunk的首地址,也就是说申请到的malloc堆的首地址都放在了itemlist里,我们点进去看看 这里说明以下,由于IDA识别不了结构体指针数组,因此指针的形式往往以_DWORD的形式进行定义,并且一个元素是一个字节。

 由于是DWORD形式,也就是双字节,占4个byte,因此item[4*i+2]代表着其实是item[16*i+8],这里可能看我博客理解不了,但是不影响做题,就不再细说了

做个验证吧,看看itemlist里是否真的存着申请到的堆地址
这里申请了三个堆

由IDA我们可以看到itemlist的地址是在0x6020c0,我们看看它存着什么东东
 可以看到如之前所说的,itemlist存着都是指向申请到的chunk用户段的指针 

接下来就是构造假的chunk了

 

 这里的FAKE_presize和size可以随意,但是fake_fd和bk则有要求
fake_ptr = 0x6020c8
fake_fd = fake_ptr-0x18
fake_bk = fake_ptr-0x10
具体是为什么呢?

首先说一下unlink的P是怎么来的

#define unlink(AV, P, BK, FD) {                                            FD = P->fd;                               BK = P->bk;//检查p和其前后的chunk是否构成双向链表if (__builtin_expect (FD->bk != P || BK->fd != P, 0))           malloc_printerr (check_action, "corrupted double-linked list", P, AV);  else {                            FD->bk = BK;                           BK->fd = FD;

当要free掉某个堆块时,如果其低地址的chunk是空闲的,那么这里的P就是被释放掉的堆块的地址减去自己的pre_size里的数值,这样就可以指向低地址的chunk的chunk头了,通过堆溢出修改掉被释放的chunk的pre_size和size,就可以达到释放该chunk时,unlink调用的P是是指向假chunk的chunk头。

ok,继续说为什么
fake_ptr = 0x6020c8(itemlist存指向chunk的地址的指针的起始地址)
fake_fd = fake_ptr-0x18
fake_bk = fake_ptr-0x10

按照unlink函数的定义,此时FD就是P->fd,即fake_ptr-0x18,那么接下来就是要判断是否
FD->bk=P
那么FD->bk=FD+0x18=fake_ptr-0x18+0x18(FD的bk在FD这个chunk头加上0x18)=fake_ptr 
成功绕过!
同理BK也是按照这样的方法去绕过
这样我们就欺骗了程序,将第一个chunk(也就是被假”free“的)与第二个chunk合并了,那么带来的后果是什么呢?
按照unlink的定义,就是使得FD->bk=BK   BK->fd=FD,也就是fake_ptr(P)指向了fake_ptr的位置,实现了对应地址任意写的操作。

OK,就写到这里了,后续无非就是泄露libc,修改got,拿到shell。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_274550.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode配置git bash为默认终端

打开左下角齿轮图标 打开Settings 搜索框输入 terminal.integrated.profiles.windows, 在下方显示的内容上点击 Edit in settings.json 配置修改如下 "terminal.integrated.profiles.windows": {"PowerShell": {"source": "PowerShell&qu…

Python每日一练(20230322)

目录 1. Excel表列序号 🌟 2. 单词拆分 🌟🌟 3. 删除有序数组中的重复项 II 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练…

营销即服务!怎么做小程序店铺打造优质用户体验?

随着移动互联网的快速发展,小程序已经成为了许多企业打造优质用户体验的重要工具。一个好的小程序店铺能够为用户提供良好的购物体验,提高用户满意度和转化率。那么,怎么做小程序店铺打造优质用户体验呢? 一:做小程序店…

Linux 信号(signal):信号的捕捉流程

目录一、程序的运行状态二、信号捕捉流程在处理信号的时候,其实要经过一系列流程的,本文就来简单介绍一下信号处理的捕捉流程。 一、程序的运行状态 程序运行状态分为内核态和用户态。程序在运行库函数、用户自定义函数等第三方函数时就会在用户态运行&…

VSCode for C/C++ 插件

VSCode for C/C 插件功能性插件C/C【千万级下载!】必选C/C Extension Pack【千万级下载!】扩展包Code Runner【千万级下载!必备】右键代码运行,格式化在终端的显示CMake、 CMake Integration、CMake Language Support、CMake Tool…

达梦数据库普通表转分区表

在生产环境中,数据库中一开始用的是普通表,但随着时间推移,数据量越来越大,可以考虑将普通表转换为分区表,提升数据库的性能。本文将介绍在DM8数据库中,实现将普通表转换为分区表的方法。环境说明数据库版本…

SpringBoot基础教程

springboot基础 一、springboot介绍 Spring Boot 提供一种快速使用spring的方式,基于约定大于配置的思想,可以让开发者不必在配置与逻辑业务中来回进行思维切换,全身心的投入到业务的代码编写中,从而大大提高了开发效率。2014年…

TypeScript的枚举与类型约束

● 上一章我们讲了 TS 的接口 ● 这一章, 我们就来聊一聊 TS 的枚举和约束 枚举 认识枚举 ● 在很多计算机语言中都有枚举的概念, 但是 JS 中是没有枚举这个概念的, 为了弥补这个缺憾 在 TS 加入了枚举类型 ● 什么是枚举呢 ? 枚举( mei ju ) : 枚举的意思就是一一列举,…

PyTorch 深度学习实战 | 基于 ResNet 的花卉图片分类

“工欲善其事,必先利其器”。如果直接使用 Python 完成模型的构建、导出等工作,势必会耗费相当多的时间,而且大部分工作都是深度学习中共同拥有的部分,即重复工作。所以本案例为了快速实现效果,就直接使用将这些共有部…

【C++初阶】六、模板初阶(函数模板+类模板)

文章目录泛型编程函数模板函数模板的概念函数模板的格式函数模板的原理函数模板的实例化模板参数的匹配原则类模板类模板的定义格式类模板的实例化泛型编程 引入 - 通用的交换函数 如果让你编写一个函数,用于两个数的交换。在C语言中,我们会用如下方法…

我让Chat GPT准备了几份SAP 顾问英文面试自我介绍的模板,大家感受一下

有个朋友说有个面试要用英文来做自我介绍,我灵机一动,不如让Chat GPT准备了几份SAP 顾问英文面试自我介绍的模板,大家感受一下。我看下来感觉写的还是中规中矩,可以一用,。 模板1 Sure, I can help you with that! Her…

【Java学习笔记】39.Java 多线程编程

Java 多线程编程 Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。 这里定义和…

navigator 拓宽前端视野

前言💐 写本文的起因是最近做了一个共享屏幕在线演示ppt的需求,发现了navigator的新大陆。原来web端开启屏幕共享是如此的简单,在接触之前还以为是多么高大上的功能,需求评审时内心还有些慌张。 人总是对自己不了解的东西心生恐惧&#x1f6…

VMware虚拟机卸载详细教程

安装过VMware虚拟机的小伙伴,90%可能都会遇到这样的问题:安装容易,卸载难。而且卸载不干净,就会导致后续安装和使用出现各种Bug。今天就给大家详细说说如何彻底干净的从本机卸载VMware。 1. 卸载之前,需要先关闭VMware…

【ChatGPT】Notion AI 从注册到体验:如何免费使用

欢迎关注【youcans的GPT学习笔记】原创作品,火热更新中 【ChatGPT】Notion AI 从注册到体验1. Notion AI 介绍1.1 Notion AI 简介1.2 Notion AI 的核心能力1.3 Notion AI 与 ChatGPT 的比较2. Notion AI 国内用户注册2.1 PC 端用户注册2.2 移动端用户注册3. Notion …

如何用C语言实现渣男通讯录

注意:纯属玩笑,博大家一乐,切勿当真📖首先我们要知道一个渣男通讯录有哪些信息要包含哪些功能1.你的通讯录要装多少个女朋友你得规定吧;2.每个女朋友的姓名,年龄,电话,爱好这些要有吧…

springboot项目中外卖用户下单业务功能之需求分析+数据模型+功能开发(详细步骤)

一、需求分析 移动端用户将菜品或者套餐加入到购物车后,可以点击购物车种的 去结算 按钮,页面跳转到订单确认页面,点击 去支付 按钮则完成下单操作。 二、数据模型 用户下单业务对应的数据表为orders表和order_detail表: order…

ESP32-CAM 环境搭建(离线)

云盘:Arduino IDE链接:https://pan.baidu.com/s/1yk_tKH8eK8okp5z9qv1TLg 提取码:pz2h内含:IDE arduino-ide_nightly-20230322_Windows_64bit.zipSDK esp32_package_2.0.5_arduinocn.exe步骤1,IDE为绿色版,…

57、C语言程序设计谭浩强第五章习题

1、输入两个正整数m和n,求其最大公约数和最小公倍数 辗转相除法&#xff1a; #include <stdio.h>int main(){int m,n,temp;scanf("%d %d",&m,&n);if(m<n){tempm;mn;ntemp;}int dn*m;int r;while(rm%n){mn;nr;}printf("最大公因数为:%d&#…

ONES 入选北大光华 MBA 整合实践项目,推动校企合作

近日&#xff0c;ONES 旗下开源问答社区软件 Answer 入选北京大学光华管理学院 MBA 整合实践项目&#xff0c;并受邀出席项目启动会。同时入选的还有国电投清洁能源基金、京东零售、瑞尔集团、美国丹纳赫集团、大众汽车&#xff08;中国&#xff09;和贝壳找房六家国内外知名企…