题目来源
2018强网杯线上赛-pwn,下载。
漏洞类型
gets()函数导致栈溢出,覆盖指向堆块的指针,可以实现任意地址读和任意地址写。
The quieter you become, the more you are able to hear!
这个题目同样是2018强网杯线上赛的pwn题—-note,题目可以在这里下载。
这里涉及到两个知识点:
1:malloc_consolidate对fastbin的合并。
2:在程序开启RELRO技术之后,不能对GOT表进行改写的情况下,利用覆盖__realloc_hook来实现控制流劫持。
对于realloc函数,我以往的认识大概就是具有对指定地址堆块的重新分配功能。如果新申请的内存大小小于或者等于原先的内存,那么就会返回原先的堆块指针;如果新申请的内存堆块大小大于原先的内存,那么就会新开辟一块内存返回给调用者,并将原先内存的内容拷贝到新申请的内存空间中。
但是,对于realloc是以怎样的步骤来申请新的内存的却不是很清楚。
在实际运行程序时,经常会遇到一个问题,电脑上安装的glibc版本不符合要求,由于glibc是最底层的库,不可能重新编译glibc,这样会导致系统崩溃。
所以,怎么解决这个问题就很有必要了。
afl是一款非常强大的fuzz工具,关于它的介绍和使用,网上有很多文章。
这里记录一下我在安装afl之后,使用qemu模式时遇到的一点问题,afl-qemu可以在没有源码的情况下对程序进行fuzz。
这个题目是2018强网杯线上赛的题目,题目在这里可以下载。可以使用两种方法来解决,一个是small bin的double free,一个是fast bin的double free。顺便总结一下这两个double free。
在前一篇文章里基本介绍了glibc的堆内存管理,但是没有深入分析chunk的释放过程,这里涉及到一个unlink宏,下面将详细说下当free一个chunk的时候,glibc具体进行了那些操作。
1:检查前一个chunk是否是free状态,这里根据被free chunk的size字段的P位进行判断,如果是free状态,则使用unlink宏将前一个free chunk从其对应的bin中取出来,和当前被free的chunk进行合并操作。
2:检查后一个chunk是否是free状态,这里根据后一个chunk的后一个chunk的size字段的P位进行判断,对于如何定位到next-next chunk,可以在当前chunk的地址上加上chunk的size进行定位。如果后一个chunk为free,则使用unlink操作,将其从对应bin中取出来,并与前面合并后的chunk进行合并操作。
在做ctf题目的过程中,遇到了cbc字节翻转攻击的利用技巧,在深入学习之后,觉得应该记录下来,以免遗忘。
分组密码链接模式的特点在于:加密时,每一个明文分组(除了第一个明文分组)加密之前都需要和前一个密文分组进行异或处理之后,才可以进行加密处理;解密时,每一个密文分组经过解密处理之后,都需要和前一个密文分组进行异或处理,才可以得到对应的明文分组。
分组密码链接模式,顾名思义,加密和解密过程都是以分组进行的。每一个分组大小为128bits(16字节),如果明文的长度不是16字节的整数倍,需要对最后一个分组进行填充(padding),使得最后一个分组长度为16字节。
对于加密时的第一个明文分组,需要通过和IV(初始化向量)进行异或处理之后,才可以进行加密处理;解密时的第一个密文分组,解密之后,需要通过和IV进行异或处理,才可以得到第一个明文分组。
这里的IV为不可预测的,随机生成的16字节向量,它不需要保密,但是需要保证完整性。