这是pwnable.kr的签到题,记录pwn入门到放弃的第一篇。
ssh fd@pwnable.kr -p2222 (pw:guest)
题目很简单,登录上了ssh后,发现了3个文件:fd,fd.c,flag
首先下载fd.c
1 #include2 #include 3 #include 4 char buf[32]; 5 int main(int argc, char* argv[], char* envp[]){ 6 if(argc<2){ 7 printf("pass argv[1] a number\n"); 8 return 0; 9 }10 int fd = atoi( argv[1] ) - 0x1234;11 int len = 0;12 len = read(fd, buf, 32);13 if(!strcmp("LETMEWIN\n", buf)){14 printf("good job :)\n");15 system("/bin/cat flag");16 exit(0);17 }18 printf("learn about Linux file IO\n");19 return 0;20 21 }
题目不是网络数据包题目,登录ssh用户,直接运行即可。
题目需要一个参数,参数的目的是在第10行,用于构造fd,即第12行 read函数的fd指针。
fd是一个文件指针,在头文件中直接定义的文件指针有三个stdin、stdout、stderr。分别对应数值为0、1、2,利用这一点,可以解决这个问题。
read函数特性是如果读取的是一个固定文件,即一次性读完,如果不是则阻塞并等待输出,并且以行单位读取。
因此,构造fd = 0、1、2均能达到用户输入的值赋给buf变量的效果,类似于web ctf中常用的php://input协议。
解题时,首先将0x1234转换为10进制,——4660.
这里也是一个坑,atoi不能转换十六进制的参数变量,比如:
接下来,输入 ./fd 4661之后,程序阻塞于read()函数处
,可输入LETMEWIN
签到题就踩了坑,离放弃更进一步。
ps: 晚上游泳去。