堆题,先看保护
32位,Partial RELRO,没pie关键信息就那么多,看ida
大致就是alloc创建堆块,free释放堆块,dump打印堆块内容
但是仔细看这三个函数就可以发现在实际运行中,会先创建一个存有free相关函数的地址和打印堆块内容相关函数的地址。
看delete函数并结合动态调试,可以知道释放堆块的过程实际上是调用先创造的12字节堆块的rec_str_free。那也就意味着无论那块地址存的是哪里的地址,我们在free堆块时他都会执行,并且题目给了我们system。注意,这里释放堆块之后并没有清除指向堆块的指针,也就是存在records数组的地址,所以我们可以利用这一漏洞修改12字节堆块中fr