题目描述
解法
Ubuntu连接靶机(连不通的可以试一下proxychains)
ssh fd@pwnable.kr -p2222
scp命令拷贝下fd源码文件
scp -P2222 fd@pwnable.kr: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; // fd为文件描述符
// 0 表示标准输入
// 1 表示标准输出
// 2 表示错误输出
int len = 0;
len = read(fd, buf, 32);
if(!strcmp("LETMEWIN\n", buf)){
printf("good job :)\n");
system("/bin/cat flag"); // 读取flag
exit(0);
}
printf("learn about Linux file IO\n");
return 0;
}
man atoi
查函数,字符串转为数字
将0x1234
的十六进制4660
作为输入字符串,此时fd=atoi(argv[1])-0x1234=0x1234-0x1234
,得到文件描述符0表述标准输入,再输入LETMEWIN
即可获得flag
Flag
mommy! I think I know what a file descriptor is!!