一开始特别懵的一道题。

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的更多相关文章

  1. 【pwnable.tw】 starbound

    此题的代码量很大,看了一整天的逻辑代码,没发现什么问题... 整个函数的逻辑主要是红框中两个指针的循环赋值和调用,其中第一个指针是主功能函数,第二个数组是子功能函数. 函数的漏洞主要在main函数中, ...

  2. 【pwnable.tw】 applestore

    做到这道题的时候正赶上iPhone 8上市,撒花~(虽然不知道为啥) 程序分析: 先进到main函数,比较简单. myCart位于bss段上,是一个长度为0x10. 主要的处理函数是handler函数 ...

  3. 【pwnable.tw】 alive_note

    突然发现已经两个月没写过WP了,愧疚- -... 此题也算一道分数很高的题目,主要考察Shellcode的编写. 又是一道题目逻辑很简单的题. 首先提供了三个函数 查看,删除,添加 查看函数: 此函数 ...

  4. 【pwnable.tw】 death_note

    题目逻辑比较简单,大概增加和删除和打印三个功能: show函数中,打印各日记内容,由于这题没有给出libc文件,应该不需要泄露地址,估计用处不大: delete函数中,正常的free,然后指针修改为n ...

  5. 【pwnable.kr】 asm

    一道写shellcode的题目, #include <stdio.h> #include <string.h> #include <stdlib.h> #inclu ...

  6. 【pwnable.kr】 [simple login]

    Download : http://pwnable.kr/bin/login Running at : nc pwnable.kr 9003 先看看ida里面的逻辑. 比较重要的信息时input变量再 ...

  7. 【pwnable.kr】 brainfuck

    pwnable.kr第二关第一题: ========================================= Download : http://pwnable.kr/bin/bfDownl ...

  8. 【pwnable.kr】 unlink

    pwnable.kr 第一阶段的最后一题! 这道题目就是堆溢出的经典利用题目,不过是把堆块的分配与释放操作用C++重新写了一遍,可参考<C和C++安全编码一书>//不是广告 #includ ...

  9. 【pwnable.kr】 memcpy

    pwnable的新一题,和堆分配相关. http://pwnable.kr/bin/memcpy.c ssh memcpy@pwnable.kr -p2222 (pw:guest) 我觉得主要考察的是 ...

随机推荐

  1. Typescript 实战 --- (8)高级类型

    1.交叉类型   将多个类型合并成一个类型,新的类型将具有所有类型的特性,适用于对象混用   语法: 类型1 & 类型2 & 类型3 interface CatInterface { ...

  2. Kali 2020.1 默认密码不是toor

    官方2020年一月28日的文章中指出root/toor is dead. Long live kali/kali. 登录用户名和密码是kali:kali 但是虚拟机镜像下载页面没有及时更新,仍然提示登 ...

  3. UIKit框架使用总结--看看你掌握了多少

    一.经常使用的,基本就是每次项目迭代都需要使用的 UIView.UILabel.UIImage.UIColor.UIFont.UIImageView.UITextField.UIButton. UIS ...

  4. pycharm中Terminal中运行用例

     1.设置终端路径 2.单个用例文件运行 3.多个用例文件,例如加载用例的文件运行 1.可能会出现如下错误(参考:https://blog.csdn.net/qq_36829091/article/d ...

  5. 4 CSS导航栏&下拉菜单&属性选择器&属性和值选择器

    CSS导航栏 熟练使用导航栏,对于任何网站都非常重要 使用CSS你可以转换成好看的导航栏而不是枯燥的HTML菜单 垂直导航栏: <!DOCTYPE html> <html> & ...

  6. 吴裕雄--天生自然ORACLE数据库学习笔记:表分区与索引分区

    create table ware_retail_part --创建一个描述商品零售的数据表 ( id integer primary key,--销售编号 retail_date date,--销售 ...

  7. swoole 消息队列

    <?php /** * 场景: * 监控订单表状态 队列通信 * 一个进程向队列发布消息 另外两个进程争抢 */ //设置主进程名 echo '主进程id:' . posix_getpid() ...

  8. JSTL fn:replace()函数替换 换行符

    转自:http://blog.163.com/chenjie_8392/blog/static/439339842010513128139/ 近日在使用textarea时,输入了回车,为了将texta ...

  9. gets和scanf区别

    scanf 和 gets 读取字符串 深入了解scanf()/getchar()和gets()等函数 scanf与gets函数读取字符串的区别 今天看到一段话,大致是说gets比scanf()快,有点 ...

  10. shell脚本中 “set -e” 的作用

    #!/bin/bash set -e command 1command 2 每个脚本都应该在文件开头加上set -e,这句语句告诉bash如果任何语句的执行结果不是true则应该退出.这样的好处是防止 ...