在linux命令行界面输入ssh fd@pwnable.kr -p2222
密码为guest
链接上后发现目录下有fd fd.c和flag三个文件,直接cat flag查看flag会显示无权限,必须通过fd可执行文件进行获取flag.
查看fd.c,源码比较简单
#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;
}
通过read()函数读取数据到buf字符数组中,然后与“LETMEWIN”进行比较,如果一致,则执行system(“/bin/cat flag”)返回flag。
关键在于read()函数,查询可知fd为文件描述符,系统用它来标识打开的文件。
通常,一个进程打开时,都会打开三个文件:标准输入(stdin),标准输出(stdout)和标准出错处理(stderr),这3个文件分别对应文件描述符为0,1,2。
所以我们这可以通过输入4660(0x1234)来控制fd为0,使程序读取键盘输入,然后输入LETMEWIN执行system(“/bin/cat flag”)。