萌新带你开车上p站(终极番外)(2)
2022-11-12 来源:acgdir.com
也就是说代码中的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个字节,与x00x0ax00xff比较,从stderr读4个字节,与x00x0ax02xff比较
那么问题来了,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。
看第二部分//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个字节,与x00x0ax00xff比较,从stderr读4个字节,与x00x0ax02xff比较
那么问题来了,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。