hwb_2019_mergeheap
又是一道好题,很喜欢,但是也证明了我很菜。
全开
函数分析:
main():
ADD():
Show():
Del():
Merge():
- 首先看到add函数里面,第一眼看过去没有问题的,如果说超过预输入长度,就直接跳过,但是如果等于输入长度,末尾就不会置0。
- 然后是Show函数,show函数使用的是puts函数,puts函数就可能用来泄露libc或者是main_arena的地址或者是其他的东西
- Del函数比较严谨,没有野指针,也没有Double_Free,应该是没有UAF或者说Double_Free之类的漏洞。
- Merge函数如题目所说。应该就是最重要的一个函数,漏洞点也应该在里面。关键函数就是两个str函数,一个strcpy,一个strcat,两个函数都有一个性质,就是遇到’\x00’才会截断。利用这个性质可以做很多事情。
思路分析:
知道了上面这些函数之后,就可以开始构建思路了。首先,需要泄露一次libc地址,不然没办法做。在2.27之中,还是需要先绕过tcache_bin,然后才能去到unsorted_bin之中。先malloc8个,free 7个进入tcache_bin,然后再free一个使其进入unsorted_bin之中。
这样就能使得0再tcache_bin之中。然后再malloc(0x8)大小的chunk,并且填满,因为在之前的add函数之中,只要len(字符串) == 输入长度,最后一位就不会变成’\x00’。这样就能在puts的时候,把unsorted_bin之中残存的Main_Arena的地址一起泄露出来。
然后就是需要做到修改malloc_hook的地址了,这里就需要利用到add()以及merge()的两个漏洞了。
如果说我们add(0x40,‘a’*0x40)&&add(0x48,‘a’*0x48),然后再merge两个函数,根据两个函数中的性质,也就是strcat只会被’\x00’截断,因此就可能会把下一个chunk的size给一起复制出来,利用这一点,就能做到堆重叠,然后任意地址改。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yCzFYV59-1647949112518)
这就是修改成功的结果,然后就能对 __ free_hook进行修改为任意值
最后上exp:
# -*- coding: UTF-8 -*-
from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
local_file = './mergeheap'
libc = ELF('/home/Desktop/Libc/U18/libc-2