堆溢出off-by-one (asis-ctf-2016 b00ks)

本文最后更新于 2024年10月23日 晚上

一个出题人特地设计的怪怪的堆

利用点:出题人特地设置了可定义的跳转,并且给了后门函数

image-20240323221856331

先进入这里,看init_User

image-20240323221439508

  • 每次创建一个0x98大小的堆块来记录头信息,参数是0x98,由于堆管理机制,会创建0xa0大小(存在标记位,所以看着是0xa1)

image-20240323221528336

  • 然后看add_User的malloc_lenth的参数是我们输入的长度

  • 点进去malloc_lenth发现,还把原来的长度乘了2image-20240323221806037

  • 以0x90或者0x98都会创建0xa0大小的堆块,所以输入的参数用0x48或者0x4c都可以(0x4c我试了可行)

    第一次创建:

    1
    add('kkkk',0x4c,'a'*0x28+p64(backdoor))

    创建出两个0xa0大小的块,然后free掉

    这时候有两个free的块,再创建一次,把第一个0xa0的块占掉,第二个也就是我们输入了后门函数的需要留下。为了让它留下,需要使得第二个块的大小大于0xa0,这里我尝试用0x50,乘2为0xa0,需要的大小为0xb0。

1
add('kkkk',0x50,'aaaa')

所以这一次不会使用tcache的0xa0的块,而是直接向下切割出更大的空间。

image-20240323222822702

然后再调用创建块的选项,会使用我们这个在相应位置填有相应后门的块,会使得成功跳转。


堆溢出off-by-one (asis-ctf-2016 b00ks)
https://xyyr-c.github.io/2024/10/23/一个出题人特地设计的怪怪的堆/
作者
xyyr
发布于
2024年10月23日
许可协议