💧对于堆溢出,有很多漏洞可以和它打配合,可以说是堆里面很常见的漏洞,常见的有off_by_null,House系列(后续学习到了会继续更新这个系列),unlink,等等。 今天来看一个,堆溢出修改指针,导致libc泄露以及通过指针来修改got表的题目。 题目连接我放下面了,对堆有兴趣
?堆溢出漏洞是一种常见的漏洞,存在多种配合漏洞,如off_by_null、House系列、unlink等。本文将探讨堆溢出修改指针,导致libc泄露以及通过指针来修改got表的题目。
题目链接?:
https://pan.baidu.com/s/1_j2gw22PQHK-PiC8HUcVvg?pwd=d2wt
提取码:d2wt
本题目为32位,got表可以修改。在堆题目中,保护全开的情况很常见,需要关注保护措施。若got表可以修改,可尝试修改free或malloc的got表。若无法修改got表,可以考虑__free_hook和__malloc_hook。
32位ida静态分析显示有一些功能函数,其中add函数申请了两个chunk,第一个大小为输入的值,第二个为固定的0x80大小。输入的name保存到了第二个chunk,同时将第一个chunk的指针放到了第二个chunk的数据里。
update函数对输入的chunk的判断依据大小是name chunk和输入数据chunk之间的距离,若先申请一些chunk将它们隔开,则可实现较大的堆溢出。
delete函数将chunk1和chunk2都进行了释放。
show函数可以进行name和text的打印。
?思路:申请chunk时首先到bin里查找,若无则从Topchunk切割一块。若申请的大小超过0x20000,则不是mmap分配。释放时若两块chunk物理相邻,则会合并。通过申请和释放chunk,可以实现堆溢出。
指针修改之前:
修改之后:
chunk1的指针换成了free_got表地址,打印chunk1时可进行泄露,之后修改chunk1即可修改free_got表为system,最后释放chunk2(/bin/sh)即可获得shell。
exp:
常回家看看系列持续更新..........
小编推荐阅读