pixiv网页版入口 p站怎么进

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为何值均添加此环境变量


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: