入门级的堆题,拿来学习还是不错的。
做这道题之前,最好还是先对堆的数据结构有一定的了解。
拿到题目,下载附件,查看保护。
一个32位的程序,开了NX和Canary保护,这都不是重头戏毕竟这题不用栈,栈保护只是锦上添花罢了。
把文件拖进IDA查看逻辑:
可以看到,典型的菜单题,这很pwn,实现了增删改查四个功能,像极了C语言程序设计的期末结业程序设计题哈哈哈,暴露年龄。
进入增加用户功能:
可以看到,程序先malloc一个块用于保存数据,再malloc一个块作为结构体,用于保存name和description,name为124,也就是0x7c,注意他们都是指针哦。
这里有个保护就是v3+*ptr[a1]<=*ptr[a1]-4才行
意思就是你写入的数据不能把后面的结构体给覆盖了,但是这却没有考虑堆申请的规则。
题目思路:
我们首先申请两个堆,然后释放掉一个,在申请一个大的,根据堆的数据结构申请规则,就会产生绕过保护的现象,如下图: