首先我们先在pwnable.kr上选择这道fd题目,应该是第一道,也是我第一次做pwn。
这里我们通过ssh工具来进行连接,我使用的是MobaXterm
在这里设置主机名:pwnable.kr ,端口为2222,账号为fd,密码为guest。
我这里因为工具的原因,不需要执行ls来看有哪些文件,从左侧可以看出有三个文件,其中flag文件是我们需要的,可惜我们没有权限去read。这里还是算比较友好的,是开源的,我们可以直接cat fd.c来查看该文件的源码。
这里我第一天题目做出来只是有很浅薄的认识,知其然不知其所以然。后面Johnny老哥讨论的时候,他问了我几个问题给我问倒了,随后我又进行一行一行的查询理解总算是把这道题吃透了。
前面三行#include学过编程的应该都知道,这是要引用头文件,类似java、python调用库。
char buf[32];这里意味着声明一个大小为32的字符型数组buf。
int main(int argc, char* argv[], char* envp[])这里意味着定义一个main函数,第一个参数argc的值表示程序运行时,命令行参数的个数。第二个参数*argv[]的值表示指向字符串数组的指针,每个字符串对应一个参数。第三个参数是用来取得系统的环境变量,如:在DOS下,有一个PATH变量。当你在DOS提示符下输入一个命令的时候,DOS会首先在当前目录下找这个命令的执行文件。如果找不到,则到PATH定义的路径下去找,找到则执行,找不到返回Bad command or file name 。在DOS命令提示符下键入set可查看系统的环境变量。
if(argc<2){
printf("pass argv[1] a number\n");
return 0;
}
这里的意思是,如果argc<2的话,输出pass argv[1] a number。argc用来统计参数的个数,因为路径为默认的参数,所以argc至少为1,所以这里一定要至少有一个数字输入。
int fd = atoi( argv[1] ) - 0x1234;这里申明一个整型变量fd(fd应该是filedes的意思P.S.如果说错了希望能私信我指出),atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,就是把argv[1]的输入强制转换为整型数,这里的argv[1]就是我们的第一个输入。argv[0]是输入的路径,argv[1]、argv[2]......就是我们的第一个、第二个....个输入。这里把我们的输入进行了减法操作,把我们的输入-0x1234后赋值给fd。
int len = 0;这里申明len=0。
len = read(fd, buf, 32); 这里是一个read函数,fd的值分三种情况,①fd=0:代表stdin(标准输入)②fd=1:代表 stdout(标准输出)③fd=2:代表 stderr(标准错误)。后面意味着从fd处读取32个字符作为buf。
strcmp("LETMEWIN\n", buf)这里我们一层层来看,这里的strcmp(string compare)是用来对比字符串的,这里要做一个LETMEWIN和buf内我们输入的进行对比,如果两个一样则为0,两个不一样则为1。
if(!strcmp("LETMEWIN\n", buf)),这里在前面的基础上加上了一个!意味着取反,如果两个一样就为1,两个不一样就为0。在if函数里,输入为1则为真,输入为0则为假,所以要将此处strcmp的结果进行取反来达到验证的目的。
后面的代码就是简单的输出和调用system来执行cat flag的命令了,这里就不再解释了。
继续解题,我们可以看到这里fd是需要减去一个0x1234的,0x1234是十六进制下的1234,所对应的十进制数是4660,比较快速的方法就是用程序员计算器。这里fd减去一个0x1234我第一反应就是在这里构造一个fd=0,上面提到了fd=0是标准输入。
这里我输入了4660,这时候就跳到下一步了,输入一串字符串,这里要和LETMEWIN做一个比对,要完全一致,所以我们在这里输入一个LETMEWIN,注意:要完全一致!
这里就按照程序顺序执行下去了,good job是打印的成功信息,mommy! I think I know what a file descriptor is!!这里加粗的就是这道题的flag。题目到这里是做完了,提交过后便算过关了,但是秉着学习的态度,我做了一下fd不为0的测试。
当我输入4661,令fd=1,可以成功cat flag。
当我输入4662,令fd=2同样可以。这里可能是作者为了对新手友好一点的表现吧,毕竟是入门第一道题目,只要这里的fd=0、1/2都可以成功获取flag,fd=0、1、2均是合法输入,均会顺序执行下去。题目就到这里结束了,如有不对的地方,望大家指出,谢谢!