fd - pwnable

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值为 整数参数0x1234atoi将字符串转换成整数的一个函数。

然后调用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函数作用是比较两个字符串是否相同
  • 输入十进制数,机器存储也是十进制数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值