这是pwnable.kr的签到题,记录pwn入门到放弃的第一篇。

ssh fd@pwnable.kr -p2222 (pw:guest)

题目很简单,登录上了ssh后,发现了3个文件:fd,fd.c,flag

首先下载fd.c

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 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: 晚上游泳去。