介绍
找大佬要来的堆练习题2。
是Codegate CTF中一道堆溢出的题目。
分析程序
分析题目流程,还是比较清晰的。主要就是购买、卖出、查看并修改,还有一个隐藏选项,直接增加一个marimo。我们只会用到两个函数,secret函数,直接添加,view_modify函数,查看并修改。
结构体:
1 | struct node{ |
secret函数,添加一个marimo,birth为当前时间,size为1,name为大小0x10的堆,profile为大小为0x20*size的堆。
view_modify函数,打印节点信息,并使size增加时间差的秒数,然后再修改profile,但并没有重新realloc,所以会造成堆溢出。
1 | size = current_time + marimo->size - marimo->birth; |
利用方式
add 两次,sleep一段时间,然后修改第一个marimo的profile,溢出修改到第二个marimo。修改指针name或profile造成任意地址读,修改profile造成任意地址写。
任意地址读,读got表信息,算出libc地址,然后任意地址写修改got表为one_gadget,即可getshell。
one_gadget用脚本查到的第一个
1 | 0x45216 execve("/bin/sh", rsp+0x30, environ) |
脚本
1 | #!/usr/bin/env python2 |