pwnable.kr fd
最近保研也保上了,以后打算做软件和系统安全方向,刚好最近闲着,本科也没咋学习过这方面,所以就来刷刷pwnable.kr网站上面的题目吧,也算是打打基础了。
这里开个坑,主要是记录一下自己在刷题过程中学到的东西,然后做题也就是慢慢做着看吧,遇到不会的再去递归式学习就好啦,那现在就开始了吧。
环境
Centos7
step1
先连进去看看,看到这三个文件
step2
打开这个c文件阅读一下
首先看一下这个代码,这里用到了read函数,也就是说如果你可以输入一个合适的参数,它就可以通过这个参数去构建一个fd,我们只需要让buff数组读进去的内容等于“LETMEWIN\n”,这个题就可以做出来了。那么现在就学习一下linux环境下fd相关的知识。这里只用到了最基本的fd相关知识,即
fd == 0为从标准输入读取
fd == 1为从标准输出读取
fd == 2为从标准错误输出读取
那么我们想一下是不是让fd等于0,然后在标准输入里面输入字符串内容,就可以将它读取到buff里面了呢,下面来试一下。
step3
补充一些东西吧:int argc:这个东西是所有参数的个数char* argv[]:这个东西里面,argv[]是argc个参数,其中第0个参数是程序的全名,后面跟着的就是用户输入的参数了char* envp[]:这个东西用来取得系统的环境变量,envp保存了系统所有的环境变量路径,这个题目里面也暂时用不到奥atoi():atoi()函数会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab 缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回,返回转换后的整型数;如果 str 不能转换成 int 或者 str 为空字符串,那么将返回 0。
程序中为了让fd等于0,首先0x1234转换成十进制为4660,那么我们是不是输入4660就可以了呢,这里试一下。
然后这时候你就可以在标准输入中输入"LETMEWIN",最后跳出来的东西就是flag了。