Double free 漏洞复现与利用

本文详细探讨了2015年0ctf挑战中的Double free漏洞,通过分析堆管理机制、malloc和free函数,展示了如何利用此漏洞获取堆基址,绕过ASLR和DEP保护,最终实现get shell。文中通过动态分析和IDA逆向,揭示了漏洞点,并给出了漏洞利用步骤和攻击结果。
摘要由CSDN通过智能技术生成
2018体系结构安全大作业
申明:转载请注明出处
选题:2015 年 0ctf 题
题目描述:提供记事本功能的二进制文件,找出其漏洞,get shell

第一章 操作说明

为方便老师审核作业,本报告将操作说明放在第一章。
操作流程如下:
1 、安装 netcat 。
2 、安装 pwntools 库。命令: pip install pwntools (安装过程中,一定要保证网络畅通,曾经因为网不好装这个库装了一个下午。。。)
3 、进入 netcat-0.7.1/src 文件夹,将 freenote 文件(可执行文件)和 zy ( python 编写的 exploit 文件)拷本到 src 文件夹下。
4 、打开一个终端进入 netcat-0.7.1/src 目录,执行命令: ./netcat -e bash -lvp 10003

5 、再打开一个终端,执行命令: python zy

第二章 相关原理简述

本报告只重点讲解本实验需要用的的知识,其他的相关知识请自行查阅。

2.1 堆管理机制

什么是堆

堆是在程序运行时 , 而不是在编译时,请求操作系统动态分配给自己的内存,程序对其访问和对一般内存的访问没有区别。

堆的特点
1 )堆的基本单位是一块块连续的内存空间。
2 )堆在内存空间中不一定连续。
3 )堆可由用户管理。

堆的基本单位 —— chunk

堆的基本单位是 chunk 。在 glibc malloc 中将整个堆内存空间分成了连续的、大小不一的 chunk ,即对于堆内存管理而言 chunk 就是最小操作单位。 Chunk 总共分为 4 类: allocated chunk; free chunk; top chunk; Last remainder chunk 。从本质上来说,所有类型的 chunk 都是内存中一块连续的区域。本报告重点说明 allocated chunk 以及 free chunk ,前者表示已经分配给用户使用的chunk ,后者表示未使用的 chunk。

chunk 的特点

1 )数据区数据和指针是混用的,当本 chunk 是空闲的时候,数据区的前两个内存单元存放指针,与其他 chunk 一起形成双向环链表。

2 ) presize 和 size 不仅仅具有标识前 chunk 和本 chunk 的大小的作用,还具有寻找前一个和后一个chunk 的地址的作用,前一个 chunk 的地址 =chunk 地址 -presize ,后一个 chunk 的地址 =chunk 地址 +size 。

堆的管理

chunk 在申请时,先查找 fast bin 中是否含有符合要求的 chunk 块,如果有则从 fast bin 中获取,如果没有则查找 unsorted bin 。本报告中,漏洞程序中 chunk 的大小都大于 faastbin 的范围,所以在unsorted bin 中获取 chunk 块。chunk 在使用时由使用它的进程管理,属于 allocated chunk 。释放后属于 free chunk ,如果大小是 fast bin 范围,放入 fast bin 中,否则放入 unsorted bin 中。

本报告中,漏洞程序中 chunk 的大小都大于 faastbin 的范围,所以就存放在 unsorted bin 中。

2.2 相关函数

malloc 函数
函数形式: void *malloc(long NumBytes)
功能:该函数分配了 NumBytes 个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针( NULL )。
注意:返回的指针指向数据区,不是指向真正的 chu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值