一开始特别懵的一道题。

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. redis requires Ruby version >= 2.2.2 系统默认 ruby 版本过低,导致 Redis 接口安装失败

    安装 Redis 接口时异常 ,系统 ruby 版本过低 ! 输入命令 " gem install redis " 出现 " ERROR:  Error installi ...

  2. 操作系统OS,Python - 生产者消费者模型

    1. 缓冲区(此处用阻塞队列充当),解决消费者和生产者强耦合问题.(生产者和消费者不直接通信) 2. 通过平衡生产者线程和消费者线程,来提高程序整体处理数据速度. 3. 在并发编程中该模式能解决大多数 ...

  3. pymongo 用户密码连接

    # db mongodbdb_mongo_attr = { 'host': '*', 'port': 27, 'database':'tease', 'username':'*v', 'passwor ...

  4. F: Horse Pro 马走棋盘 BFS

    F: Horse Pro 豆豆也已经开始学着玩象棋了,现在豆豆已经搞清楚马的走法了,但是豆豆不能确定能否在 100 步以内从一个点到达另一个点(假设棋盘无限大). Input 第一行输入两个整数 x1 ...

  5. ASP.NET Core的身份认证框架IdentityServer4--入门

    ASP.NET Core的身份认证框架IdentityServer4--入门 2018年08月11日 10:09:00 qq_42606051 阅读数 4002   https://blog.csdn ...

  6. C++面试常见问题——04链表的逆序与合并

    链表的逆序与合并 链表的逆序 已知一个链表的头指针为head,将该链表逆序. #include<iostream> using namespace std; struct Node{ in ...

  7. vs code 本地调试配置

    { "name": "使用本机 Chrome 调试", "type": "chrome", "request& ...

  8. 简析ThreadLocal原理及应用

    简析ThreadLocal原理及应用 原创: 东晨雨 JAVA万维猿圈 4月17日 ThreadLocal的源码加上注释不超过八百行,源码结构清晰,代码也比较简洁.ThreadLocal可以说是Jav ...

  9. 把链接生成二维码 二维码中间带有logo

    在工程中引入三个文件jquery.qrcode.js.qrcode.js.utf.js.其中utf.js文件是防止链接中的参数出现中文乱码现象 jquery.qrcode.js文件 function ...

  10. ch8 让div居中--使用外边距

    假设有一个布局,希望让其中的容器div在屏幕上水平居中,则只需要定义div的宽度,然后将水平外边距设置为auto <body> <div class="wrapper&qu ...