码迷,mamicode.com
首页 > 其他好文 > 详细

【pwnable.tw】 seethefile

时间:2017-09-20 18:01:40      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:self   保存文件   文件的   文件中   image   log   函数指针   溢出   想法   

一开始特别懵的一道题。

main函数中一共4个功能,openfile、readfile、writefile、closefile。

技术分享

其中,在最后退出时有一个明显的溢出,是scanf("%s",&name);

name位于bss段上,name下面有一个fp用于存储文件指针,可以被覆盖。

技术分享

再看其他函数:

openfile.只有一个简单的输入并打开,保存文件指针在bss段上的fp变量中:

技术分享

readfile,从fp所指的文件中每次读取0x18F字节字节到magicbuf中,这个变量也在bss段上。

writefile无法读取含有flag、FLAG、}的字符串,是一个打印函数

技术分享

由于无法覆盖栈上内容,仅能覆盖bss段上空间,因此想法是覆盖fp指针,通过伪造fp指针进一步利用,这种利用方法在如下文章中已经给出:

http://www.evil0x.com/posts/13764.html

另外一个重要的点在于libc的泄露。

由于linux独特的文件形式存储,文件的内存信息存储与/proc/pid/maps中,这里pid使用self来代替,如下图:

技术分享

因此libc可以通过该方式泄露。

 

伪造file指针的过程,可以通过上面的链接中大致了解,最终的步骤是构造file对象的内容,由于最终要执行fclose(fp),这一函数,而fclose中用户可控的函数指针执行位置在fclose如下位置,

技术分享

因此必须要使fclose执行到该位置,其决定性作用的是前2个字节,可以通过动态调试来获得,将fclose(fp),转化为system(fp),而fp的前两个字节有太重要的作用,建议不要动。

可以用‘||/bin/sh‘的方法执行获得shell。

至于前两个字节的调试,需要通过动态调试fclose的方法一步一步来找。

捷径的方法是用链接中给到用stderr内容来最初构建。

另外,题目中的输入方法是可以输入\x00的,算是个福利吧。

 

这题是目前做过调试最恶心的一道题没有之一。

 

【pwnable.tw】 seethefile

标签:self   保存文件   文件的   文件中   image   log   函数指针   溢出   想法   

原文地址:http://www.cnblogs.com/p4nda/p/7562457.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!