0x01 题目描述
在实验吧上练习的一道溢出类题目,题目来源为cctf_2016,通过这个题目,学习了格式化字符串漏洞的相关利用方式,在这里稍作记录。
0x02 题目分析
逆向分析
使用ida逆向分析其功能,程序主要功能为:
上传文件 通过输入及上传,程序会将二者存放到一个数组之中。
获取文件内容 通过输入文件名获取文件内容,输出的内容为文件上传功能中输入的数据。二者配合可触发fmt漏洞
列目录 使用函数将所有文件名打印出来
寻找漏洞
通过逆向分析,环节可以向缓冲区中输入自定义字符串,环节将这个字符串打印出来,如果在中构造特定格式化字符串,那么时就会造成格式化字符串漏洞,从而完成任意地址读和写。
利用思路
最终目的是想调用,获取系统shell。存在问题有三个
的address
如构造
如何调用sysputs函数别的实际地址,最后计算出libc的地址
由于system位于libc中,所以只需要确定libc的加载地址即可,我们可以使用格式化字符串泄漏出其地址,注意到程序会多次调用put_file, get_file, show_dir,那么里面用到的函数将会放到got表中,puts函数在showdir里面反复调用,可以利用其got表获取其地址,再利用其偏移得到libc的地址,这样system的地址也就出来了。 然后可以将puts的got表覆盖为system的地址,并构造一个的文件名,再调用函数就可以完成漏洞利用。
0x03 构造exploit
通过前面的分析,需要做到下面两步即可完成利用:
泄漏system地址
覆盖puts函数地址为system地址,并使其参数包含
首先,使用查询puts函数的表:
得到其got表地址为
接着需要获取puts在libc中的偏移:
偏移为
然后可通过打印出got表中的地址,获取puts函数别的实际地址,最后计算出libc的地址
addr_libc = addr_puts - offset_puts
紧接着计算出system地址
addr_system = addr_libc + offset_system
然后通用进行任意地址写,将puts的got表覆盖为system的地址
最后构造的exploit如下:
0x04 获取flag
运行exploit获取flag
Referenced
代码之间
travel between codes
领取专属 10元无门槛券
私享最新 技术干货