堆溢出off-by-one (asis-ctf-2016 b00ks)
本文最后更新于 2024年10月23日 晚上
堆溢出off-by-one (asis-ctf-2016 b00ks)
libc-2.23
漏洞点:
author name 输入为32,也就是这里的a2=32,经历了32次++a1后,a1[32]=0,而这是第33位。

其他地方对于这个scanf_s的调用正常,因为都是输入的size-1

创建堆块:
这个写着最大32,但是无妨,可以更大,需要注意的是,这里输入的size必须是十进制数。(以前做的题往往喜欢输入成0x20,0x30等等)(看了看以前做的题,都是用atoi转了,所以可以那么输入。)

book_list以及author_name_list仍然保存一个地址,那个地址指向真正的数据域

每一个book的存储大致形式:

- 用过的块的id同样不能再重复使用,最多20次对块的创建操作。
1 | |
泄露出book1的0x30大小的指挥块位置(这里指向的是id)
- 还剩0x20e80,把它用完,让mmap再分配内存。

这时候从heap里看不到那个新的很大的块,从控制块中找到它们。

接下来把60覆盖成00

不知道为什么泄露出来的book_2_name的地址与libc_base的基地址偏移每次不同
更换思路,用unsortedbin来泄露
- 原本的book2_control的距离+8刚好是可以泄露fd指针的.
- 计算得到book4_control块的距离。(这是已经到最后的new,book4之后才用debug看的距离,其实可以提前算,不过麻烦,不如直接看debug减出来距离)
1 | |
注意这里:后面一定要加长度,要不然输入不进去,这代表这description的长度
1
payload = p64(free_hook)+p64(0xffff)我用的libc直接是glibc中的2.23的,后续把它换成buu的远程就直接能通过
总exp:
1 | |
十分感谢师傅们的详细博客–参考博客:
[Asis CTF 2016] b00ks —— Off-By-One笔记与思考_asis ctf 2016 b00ks-CSDN博客
堆溢出off-by-one (asis-ctf-2016 b00ks)
https://xyyr-c.github.io/2024/10/23/堆溢出off-by-one (asis-ctf-2016 b00ks)/