程序保护情况如下
程序先打印出Please input your name: 字符串,然后获取用户输入,存到0x602328处,长度为16字节,然后打印出菜单,可以发现比较奇怪的是,菜单函数将_printf_chk函数的返回结果和0xDEADBEEF比较,相等就会执行sub_400E10()函数,但_printf_chk函数的返回值是不可能为0xDEADBEEF,猜测可能是作者特意构造的,后面肯定有用到。
执行malloc操作后的结构如下:8字节8字节8字节,8字节8字节8字节依次类推,后2个8字节为输入的字符串执行new操作后的结构如下8字节,8字节8字节8字节,8字节8字节8字节依次类推长度,0x401228+输入的字符串(16字节)可以发现当delete时,没有判断当前delete的块是malloc分配的还是new分配的,当delete掉malloc分配的块时,就会出现问题。该函数会把当前块的前8个字节当做内存块的长度,去找到函数指针的指针,然后执行该函数。由于malloc操作后的内存块的前8个字节是chunk的size字段,所以可以构造好堆中的数据,然后跳转到任意地址执行。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课