练习平台:http://pwnable.kr/play.php
首先根据提示 用ssh连接
pwnable.kr 2222 网址和端口
fd 用户
guest passwd
登陆成功 查看文件目录 发现有三个文件
看见flag我上去就是直接打开 但是 提示 没有权限
cat flag
所以我查看这三个文件的权限
ls -l
发现fd文件 有可执行权限 所以执行fd文件 但是他让我输入一个数字 然后提示我去学习linux的IO.......
./fd
./fd 1
不管了 那就读取第二个文件
cat fd.c
发现代码
#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;
}
找重点的部分进行分析
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);
}
atoi库函数
原型 : int atoi( const char *str );
功能:将字符串str转换成一个整数并返回结果。参数str 以数字开头,当函数从str
中读到非数字字符则结束转换并将结果返回。
例如:int num = atoi("1314.012");
int值为1314
第一行代码可以看出 输入的数字要减去0x1234
第三行的read这一块还是真不会 所以去百度了一下 read的用法
大致的意思就是从fd里读取数据 保存到buf中
然后根据第四行的代码 进行判断 两个值是否相等 所以 要想办法输入 LETMEWIN
在《c程序设计语言》中,有这么一句话:当命令解释程序(即shell)运行一个程序的时候,它将打开三个文件,对应当文件描述符分别为0,1,2,依次表示标准输入、标准输出、标准错误。
然后再根据第一行代码中的atoi库函数可以了解到 如果使输入的数减去0x1234的话 就为0 那么就会从新输入
fd@pwnable:~$ ./fd 4660
LETMEWIN
最后得到flag 进行提交