lab10
这一题开始就是堆的范畴了
题目介绍
程序只开启了NX保护
有三个功能,分别是add,delete跟print
1 | ---------------------- |
先一看一下add:
主要过程就是先申请一个8的堆用来存储print函数和数据的地址(也是堆地址),数据另外存储在新申请的malloc(size)堆中, 然后这个8大小的指针会存到bss去(notelist),也就是如下图
接下来看delete函数:
通过indext free 掉add过程中申请的两个堆空间,但是free后并没有将指针清空,而且指针扔留在bss中,所以就存在了Use-After_Free
printf函数:
通过indext找到对应的printf 函数调用
程序中还存在cat flag函数,所以我们只需要想方法调用这个函数就行了
利用过程
通过分析程序的功能我们发现存在uaf漏洞,具体但用过程:
1、先申请3个chunk块,大小为16(fast bin 范围内即可)
2、free 掉chunk1、chunk2
此时fast bin 中的分布是这样的:
1 | fastbins |
notelist 中是这样的:
1 | pwndbg> telescope 0x0804A070 |
此时我们再申请一个大小为8的chunk,内容为magic函数地址,这样,0x97c5000就会指向magic函数
1 | pwndbg> telescope 0x0804A070 |
printf chunk1即可执行magic函数
exp:
1 | from pwn import * |
lab 11
首先程序的功能很简单,增、删、查、改
在change功能中没有对len进行检测,存在任意长度的堆溢出
同时函数有可以直接读flag的后门函数
程序在开始的时候申请了一个大小为0x20的堆块用来存放hello_message
跟goodbye_message
函数指针,开始时调用hello,结束时调用goodbye
最简单的做法就是house of force 申请到存放goodbye指针的堆块,修改goodbye为magic
exp:
1 | from pwn import * |
做为练习,感觉用后门太*了,所以也可以通过unlink修改got表getshell
exp:
1 | from pwn import * |
lab12
程序功能:
跟常规堆题一样有一个flowlist的全局数组来存放堆块,在del函数中只是将标记置为0,并没有将指针置空,所以存在uaf
利用思路:
泄漏出libc地址 —> double free attack 修改malloc_hook为onegadget,调用malloc getshell
exp:
1 | #coding:utf-8 |
lab13
常规堆题,增、删、查、改以及一个全局数组heaparray
edit 函数中存在off-by-one
利用思路:首先申请chunk0,chunk1,edit chunk0修改chunk1的size ,然后free掉chunk1
再申请一个新的chunk1,使得chunk1落在指向chunk1的堆块上,从而能够修改chunk1的内容指针
修改chunk1内容指针为got表泄漏出真实地址
改free的got表为system地址,然后使得chunk0内容为’/bin/sh\x00’,free(0) getshell
exp:
1 | #coding:utf-8 |
lab 14
edit函数没有对size检测存在任意长度堆溢出,且程序存在cat flag的后门
做法1
unsortedbin attack :利用堆溢出修改在unsortedbin列表尾部的bk为0x6020C0
重新申请即可将0x6020C0
修改成main_arena(unsortedbin 为FIFO)从而利用后门
1 | #coding:utf-8 |
做法2
unlink 修改free@got为system,再free掉一块内容为’/bin/sh\x00’的堆块getshell
1 | #coding:utf-8 |
lab15
这是一道C++pwn,涉及到一个C++的虚表的问题,在c++的类中的虚表会通过一个叫虚表的东西进行跳转从而执行函数,关于虚表的知识点可以参考这位大佬:http://showlinkroom.me
一片红,NX都没开,还有RWX段,显然可以写shellcode,解题的思路在于,修改虚表,跳转到shellcode的位置执行。
虚表大概可以理解为:一个视情况指向相对应函数地址的指针(很显然这说法是错的)
虚表大概是这样子:
而且我们要让它变成这样:
结合IDA我们能看到,新申请的类是放在animallist数组中的,也就是说animallist存着指向虚表的指针
先申请两个dog,我们可以看到,animallist上存放着指针指向一个指向Dog::speak函数的指针(也就是虚表)
结构清楚了,再来看程序,这里没有限制长度,可以造成堆溢出而且长度不限,所以我们只需要通过溢出将指向shellcode地址的指针写到0xf4ac20
上就行了
exp:
1 | #coding:utf-8 |