使用ssh fd@pwnable.kr -p2222连接
输入密码guest
1 fd@prowl:~$ ls -al 2 total 40 3 drwxr-x--- 5 root fd 4096 Oct 26 2016 . 4 drwxr-xr-x 114 root root 4096 May 19 15:59 .. 5 d--------- 2 root root 4096 Jun 12 2014 .bash_history 6 -r-sr-x--- 1 fd_pwn fd 7322 Jun 11 2014 fd 7 -rw-r--r-- 1 root root 418 Jun 11 2014 fd.c 8 -r--r----- 1 fd_pwn root 50 Jun 11 2014 flag 9 -rw------- 1 root root 128 Oct 26 2016 .gdb_history 10 dr-xr-xr-x 2 root root 4096 Dec 19 2016 .irssi 11 drwxr-xr-x 2 root root 4096 Oct 23 2016 .pwntools-cache 12 fd@prowl:~$ cat fd.c 13 #include <stdio.h> 14 #include <stdlib.h> 15 #include <string.h> 16 char buf[32]; 17 int main(int argc, char* argv[], char* envp[]){ 18 if(argc<2){ 19 printf("pass argv[1] a number "); 20 return 0; 21 } 22 int fd = atoi( argv[1] ) - 0x1234; 23 int len = 0; 24 len = read(fd, buf, 32); 25 if(!strcmp("LETMEWIN ", buf)){ 26 printf("good job :) "); 27 system("/bin/cat flag"); 28 exit(0); 29 } 30 printf("learn about Linux file IO "); 31 return 0; 32 33 } 34 35 fd@prowl:~$ ./fd 4660 36 LETMEWIN 37 good job :) 38 mommy! I think I know what a file descriptor is!! 39 fd@prowl:~$
关注read()函数
函数定义:ssize_t read(int fd, void * buf, size_t count);
函数说明:read()会把参数fd所指的文件传送count 个字节到buf 指针所指的内存中。
返回值:返回值为实际读取到的字节数, 如果返回0, 表示已到达文件尾或是无可读取的数据。若参数count 为0, 则read()不会有作用并返回0。
fd == 0为标准输入
fd == 1为标准输出
fd == 2为标准错误输出
所以先构造fd==0,即使argv[1] 等于 0x1234(4660)
然后输入LETMEWIN
得到flag:
mommy! I think I know what a file descriptor is!!