介绍
堆方面的题做的实在太菜了,找大佬要了几道题,来练练手。
这是CISCN中的一道简单的堆的题目。
分析程序
分析题目流程,比较清晰。add添加、del删除、list显示全部、price修改价格、description修改描述。其中bss段中那段数据的结构体如下。
1 | struct n{ |
其中漏洞在修改描述处,realloc重新分配内存的时候,没有将原来的指针修改为新指针。当relloc一个比原来大的地址的时候,会分配新的空间,但指针仍指向原来已经free的trunk。
1 | for ( size = 0; size <= 0 || size > 256; size = getint() ) |
利用方式
首先,add两次,修改第一个节点的描述,此时chunk结构如下:
1 | add('1111', 20, 0x70, 'a'*0x6f) |
然后,再add一次,根据heap分配的原理,他首先回去找已经释放的chunk 0x9260020
是否可用,我们add的时候选择一个合适的大小,即可分配到此处。
1 | add('3333',20,0x50,'') |
接着,再次修改’1111’的description,即可修改’3333’的结构体内容,修改结构体中的description指针,为任意值。就可以利用list进行任意读,利用description进行任意写。
脚本
1 | #!/usr/bin/env python2 |