[原创]PwnKr第一站
题目源码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
int main(int argc, char* argv[], char* envp[])
{
if(argc<2)
{
printf("pass argv[1] a number\n");
return 0;
}
int fd = atoi( argv[1] ) - 0x1234;
int len = 0;
len = read(fd, buf, 32);
if(!strcmp("LETMEWIN\n", buf))
{
printf("good job :)\n");
system("/bin/cat flag");
exit(0);
}
printf("learn about Linux file IO\n");
return 0;
}
解题步骤:
SSH连接成功后输入题目内对应的PassWorld
进入题目:
输入ls命令,查看当前路径下的文件:

可以看到,有三个文件,使用cat命令显示fd.c文件:
得到源码,从题目可知此题是为了让我们学习linux系统下的文件描述符。在windows系统下也有类似的东西,叫做文件句柄。 这里不多赘述。
我们现在开始分析源码...
Londoing.....
从main函数数起,第八行的if语句是关键的判断语句。因为它一旦判断通过,就可以输出flag了!
这里的strcmp("LETMEWIN\n",buf)是用于比较字符串的。如果"LETMEWIN\n"和buf一致
则返回0,如果不一致则返回正数。
buf是一个长度为32的字符型数组。
我们记住buf往上找,又一次看见了buf它出现在第七行的read(fd,buf,32)中。
read函数用来从文件中的读取内容,
fd的位置上会出现三种情况,
0:代表stdin(标准输入)
1:代表 stdout(标准输出)
2:代表 stderr(标准错误)
buf的位置是一个指向缓冲区的字符指针
32的位置是要取出的字节数
我们现在需要向buf里输入字符,所以我们需要让read函数的fd参数为0。
Lucky!这条语句直接的向fd进行了赋值。atoi函数是把字符串转化从整型数的一个函数。

所以我们现在只要输入一个和十六进制的1234一样大小的十进制数(4660)即可。
现在我们就可以输入buf的字符了

出现了flag,我特意没有截全。留作练习。
