概述
如果想学习pwn,可以从http://pwnable.kr/的练习入手,本文是第一个练习fd
题目描述
点击fd的图片进入题目,提示Linux文件描述符,同时告知连接靶机的方式ssh fd@pwnable.kr -p2222
,密码为guest
解法
连接
通过ssh登录后,发现源代码fd.c和编译后的文件fd
Linux文件描述符
Linux的文件描述符如下。
源代码分析
#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;
}
可以看出:
- fd程序要求一个参数
- 这个参数经过atoi()函数转为整型后会和0x1234比较
- 如果要得到flag,需要在strcmp()中buf的结果与LETMEWIN相等
在函数read()中,fd
代表文件句柄,需要使fd
为0,这样函数read()就会从标准输入中读入内容,从而实现buf中的内容控制
解答
要使fd为0,需要<输入的参数>-0x1234=0
,即输入0x1234,但不能直接输入16进制数,因为要经过atoi()函数的转换,如果直接输入0x1234,转换为结果为0,
因此需要先转成10进制
In [1]: int('0x1234',16)
Out[1]: 4660
在运行程序./fd 4660,输入LETMEWIN按回车即可