fd-pwnable.kr
1. 连接服务器&获取题目
我们先用ssh链接上pwnable的服务器获取题目。在终端输入ssh fd@pwnable.kr -p2222
,出现提示后输入密码guest
查看目录下有的文件以及文件权限ls -l
fd为应用程序;fd.c是程序的c源代码;flag自然是目标文件,我们目标就是需要读取flag文件里面的内容
我们登录的帐号是fd,没有权限读取flag文件,但我们可以通过fd程序读取flag文件
2. 运行程序、查看文件类型、保护措施
直接运行程序,提示我们需要给出一个数字参数
几次尝试均返回错误提示信息,由此猜测应该程序应该需要输入特定参数程序才能被正确运行
查看文件的基本信息:32位动态链接的ELF
查看文件的保存措施
3.分析源码
因为题目有给出源码,所以就不需要将程序丢到IDA中分析了。如果需要将源码保存到本地,可以在新的命令窗口中输入
scp -p2222 fd@pwnable.kr /home/fd/fd.c /home/fd
连接fd@pwnable.kr的2222端口,将/home/fd/fd.c复制到本地的/home/fd
查看源码:
#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;
}
首先我们可以看到第一个if条件语句是判断我们是否有输入参数,如果没有输入参数,就返回pass argv[1] a number\n
;
当我们输入参数后,程序定义变量fd
值为 整数参数0x1234
;atoi
将字符串转换成整数的一个函数。
然后调用read函数向buf写入32字节的数据,从read函数定义中推出fd应该是文件描述符;
接着一个if判断语句使用strcmp函数比较buf与"LETMEWIN\n",如果相同则打印出flag中的信息
那么解题的关键就是,让buf的值等于"LETMEWIN\n";
fd位于read函数的文件描述符参数位,当文件描述符为0时,就是从command line获取数据,所以目标转移为让fd值为0;
fd的定义是atoi[argv[1]]-0x1234
,也就是让atoi[argv[1]]
=0x1234
(16)=4660
(10),可以推出参数应该为4660
所以整个解题过程应该为:给出参数4660
,输入LETMEWIN
flag内容为:mommy! I think I know what a file descriptor is!!
总结
- atoi函数作用是将字符串转换为整数
- strcmp函数作用是比较两个字符串是否相同
- 输入十进制数,机器存储也是十进制数