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