本文由“合天智汇”公众号首发,作者:萌新

0x01前言


这关其实和pwn关系不大,主要考察的都是linux下一些函数的操作,考察linux的基本功。涉及到的知识点包括一些经典的函数原型、IO重定向、文件描述符、管道、环境变量、socket编程、符号链接等。

这里顺便真心安利一本书,《UNIX环境高级编程》,简称APUE书里介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上结合函数原型介绍了多个应用示例,如果这本书啃透,正常题型linux下的pwn问题都不大。

0x02


登录后直接看源文件

可以看到这里分成了好几关

先看第一关//argv

第一个if要求传入100个参数

第二个if要求第A个(也就是ascii的65)参数的值为’\x00’

第三个if要求第B个(也就是ascii的66)的参数值为’\x20\x0a\x0d’

这题我们写c

这里的execve的原型为:

int execve(const char * filename,char * const argv[ ],char * const envp[ ]);

execve()用来执行参数filename字符串所代表的文件路径,第二个参数是利用指针数组来传递给执行文件,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。

也就是说代码中的execve是用于执行input程序的,而作为传入的参数,最后要以null结尾,对应代码中的args[100]=NULL

看第二部分//stdio

read函数原型为ssize_t read [1]  (int fd, void *buf, size_t count);

read()会把参数fd所指的文件传送count 个字节到buf 指针所指的内存中。

而题目源码中的fd的0,2分别对应的是stdin,stderr,这里是读4个字节到buf

然后调用memcmp

memcmp函数的原型为 int memcmp(const void *str1, const void *str2, size_t n));其功能是把存储区 str1 和存储区 str2 的前 n 个字节进行比较

整理一下,代码的逻辑就是从stdin中读4个字节,与\x00\x0a\x00\xff比较,从stderr读4个字节,与\x00\x0a\x02\xff比较

那么问题来了,stdin是标准输入,我们可以直接通过输入来控制,而stderr,该怎么控制呢

答案是IO重定向

这里涉及管道pipe的应用

pipe有两端,一段write写入,一端read读出,这里解题用到的就是把管道的read重定向到某一个流中,从而进程间可以进行通信。

这里我们的思路是父进程fork子进程,子进程write需要的四字节到pipe,父进程把pipe的read重定向到stdin,stderr。通过这种方式我们就可以控制stdin和stderr的内容了

先定义pipe

第三关//env

strcmp()用于字符串的比较,getenv()用来取得参数envvar环境变量的内容。参数envvar为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为envvar=value。

正常情况下肯定没有0deadbeef的环境变量,要想if条件成立,肯定需要我们自己写一个键值对

我们可以使用setenv()增加环境变量

setenv()原型为int setenv(const char *name,const char * value,int overwrite)

函数说明 setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。参数 value则为变量内容,参数overwrite用来决定是否要改变已存在的环境变量。如果没有此环境变量则无论overwrite为何值均添加此环境变量

本地写好源文件,对应代码为

setenv("\xde\xad\xbe\xef", "\xca\xfe\xba\xbe", 1);

这时候execve传入的第三个参数为新环境变量数组,我们声明为environ

第四关//file

打开名为”\x0a”的文件,比较前四个字节是否为”\x00\x00\x00\x00”

这关很简单,我们相应的用写权限打开该文件,写前四个字节即可

第五关//network

代码的意思是以input这个文件作为服务器,监听C端口

通过recv来接收,如果收到的为\xde\xad\xbe\xef,则通过

我们根据对应的代码稍微修改下就可以了

在本地编写完整的代码

通过scp上传

登录后切换到相应的路径编译源文件

直接执行是会报错的,因为当前目录下没有flag文件,我们又没有权限移动它,此时可以考虑使用符号链接的方式,通过绝对路径或者相对路径的形式指向flag。因为对符号链接文件进行读写会表现为直接对目标文件进行操作

这里是让/tmp/yale/flag直接指向/home/input2/flag,然后执行

萌新带你开车上p站(终极番外)的更多相关文章

  1. 萌新带你开车上p站(番外篇)

    本文由“合天智汇”公众号首发,作者:萌新 前言 这道题目应该是pwnable.kr上Toddler's Bottle最难的题目了,涉及到相对比较难的堆利用的问题,所以拿出来分析. 登录 看看源程序 程 ...

  2. 萌新带你开车上p站(二)

    本文作者:萌新 前情提要:萌新带你开车上p站(一) 0x04flag  看题目描述似乎是一个和脱壳相关的逆向题目 按照给出的地址先下载过来 file看看 是个可执行文件 执行之 emm什么都看不出来, ...

  3. 萌新带你开车上p站(Ⅳ)

    本文作者:萌新 前情回顾: 萌新带你开车上p站(一) 萌新带你开车上p站(二) 萌新带你开车上P站(三) 回顾一下前篇,我们开始新的内容吧 0x12 登录后看源码 通读程序,逻辑是这样子的: 输入6个 ...

  4. 萌新带你开车上p站(三)

    本文作者:萌新 前情回顾: 萌新带你开车上p站(一) 萌新带你开车上p站(二) 0x08 题目给的提示是和运算符优先级有关 登录后直接看源码 mistake@pwnable:~$ ls flag mi ...

  5. 萌新带你开车上p站(一)

    本文作者:萌新 0x01前言 这一系列文章为pwnable.krToddlr’s Bottle的全部题解,其中有三道题目相对而言稍难或者说比较经典,单独成篇,其他题目的题解放在一起发出来. 0x02f ...

  6. 萌新学习Python爬取B站弹幕+R语言分词demo说明

    代码地址如下:http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样 ...

  7. 萌新笔记——C++里创建 Trie字典树(中文词典)(二)(插入、查找、导入、导出)

    萌新做词典第二篇,做得不好,还请指正,谢谢大佬! 做好了插入与遍历功能之后,我发现最基本的查找功能没有实现,同时还希望能够把内存的数据存入文件保存下来,并可以从文件中导入词典.此外,数据的路径是存在配 ...

  8. 留学萌新Essay写作须知

    Essay是留学生们接触比较多的一项留学生作业,但尽管如此,依旧有部分同学对于essay写作是没有足够的把握的.随着开学季的到来,很多萌新初次接触Essay写作,难免会有很多不懂得地方.所以今天小编就 ...

  9. 从Webpack源码探究打包流程,萌新也能看懂~

    简介 上一篇讲述了如何理解tapable这个钩子机制,因为这个是webpack程序的灵魂.虽然钩子机制很灵活,而然却变成了我们读懂webpack道路上的阻碍.每当webpack运行起来的时候,我的心态 ...

随机推荐

  1. pytorch 手写数字识别项目 增量式训练

    dataset.py ''' 准备数据集 ''' import torch from torch.utils.data import DataLoader from torchvision.datas ...

  2. PyTorch中在反向传播前为什么要手动将梯度清零?

    对于torch中训练时,反向传播前将梯度手动清零的理解 简单的理由是因为PyTorch默认会对梯度进行累加.至于为什么PyTorch有这样的特点,在网上找到的解释是说由于PyTorch的动态图和aut ...

  3. Ubuntu 常用环境配置记录

    引言 经常使用 Ubuntu 虚拟机,双系统,WSL,服务器等等,每次配置常用开发环境都要去百度细节,故在此记录一下. 更换软件源 阿里云镜像 清华镜像 # 更新 sudo apt update &a ...

  4. Ubuntu中安装Hadoop

    安装前 1,更新apt sudo apt-get update   会让你输入密码(自己登录Ubuntu的时候设置的),输入密码不会显示在终端面板上,确定自己敲对之后点回车就行. 2,安装SSH服务器 ...

  5. 关于暴力破解的一些学习笔记(pikachu)

    这几天的笔记都懒得发博客都写在本地了,随缘搬上来 什么是暴力破解 就是在攻击者不知道目标账号密码情况下的,对目标系统的常识性登陆 一般会采用一些工具+特定的字典 来实现高效的连续的尝试性登陆 一个有效 ...

  6. Unity 游戏框架搭建 2019 (三十九、四十一) 第四章 简介&方法的结构重复问题&泛型:结构复用利器

    第四章 简介 方法的结构重复问题 我们在上一篇正式整理完毕,从这一篇开始,我们要再次进入学习收集示例阶段了. 那么我们学什么呢?当然是学习设计工具,也就是在上篇中提到的关键知识点.这些关键知识点,大部 ...

  7. java中Runnable和Callable的区别

    文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...

  8. 【集群实战】NFS网络文件共享服务3-相关知识补充(showmount,exports,rpc)

    1. showmount命令说明 showmount命令一般用于从NFS客户端检查NFS服务器端共享目录的情况. 参数说明: -e,--exports 显示NFS服务器输出的目录列表 [root@we ...

  9. Flutter自己实现一个ProgressHUD

    用惯了iOS的SVProgressHUD,但是在flutter pub上的并没有找到类似的实现,于是自己实现一个 主要实现四个基本功能 Loading显示 成功显示 错误显示 进度显示:环形进度条和文 ...

  10. tomcat项目迁移,无法访问,报“404”错误,原因分析

    首先,导出项目文件和MySQL数据库(项目文件直接tar&&cp:数据库直接mysqldump生成sql文件) 再,进行导入步骤,项目文件拷贝到webapps下,并赋予bin相关文件执 ...