很简单的一道题,自带后门函数,uaf梭哈就行

main函数这里是菜单和增删打印函数

add函数,在申请需要的chunk之前会先申请一个0x8(但是由于32位最小的chunk为0x10,所以实际大小为0x10)的chunk来存放print函数的地址,在这个chunk地址加4的位置存放申请的chunk的地址 所以申请的chunk是print函数的参数

delete函数,把chunk和存放print的地址给free掉,但是chunk的指针没有置null

print函数,调用puts函数将chunk的content打印

后门函数

add(0x40,b"aaaa")
add(0x40,b"bbbb")

可以看到,虽然申请了两个chunk,但是却给了4个,在第一个0x10的chunk也就是idx0这里先放了0x80485fb也就是print函数的地址,随后跟着申请到的content为aaaa的chunk去掉chunk head的地址

delete(0)

delete(1)

idx0和chunk0进了unsorted bins,chunk1进了Top chunk,idx1在fastbins 再次申请,顺便往chunk里写入后门函数的地址

add(0x40,p32(sys_addr))

可以看到现在的idx0是idx1并且chunk0是idx0的地址,这是由于申请的两个chunk大小与进到fastbins和unsortedbins的chunk大小符合,所以先把它们切出来