一、学习资料
首先当然是先学习一波理论知识,这种入门的东西百度上一大堆,我就不一一列举了,这里只放一下我的参考资料。仅供参考。
二、学习实践
在了解了基本知识之后,当然是要实践一下,我采用了Pwnable.kr,需要先自己注册一下,这里有不同难度的题目,内容涵盖多个领域,界面很可爱。youtube上也有相应的视频教程,这里有百度云的,提取码: 74ue不过建议先自己做,做出来之后可以再去看一看,学习一下新思路。
Pwnable.kr-01 fd
首先ssh连上,ls看一下都有什么东西,
可以看到有个flag文件,我们看看里面有什么,
发现没有权限,这可怎么办呢?
从上面的图中,我们也能看到,我们对flag这个文件的权限是0。既然这个文件我们没有权限,那我么们就看看还有什么其他东西吧。我们发现还有一个fd.c和一个fd文件,我们对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){//这里判断命令行参数个数是否小于2
printf("pass argv[1] a number\n");
return 0;
}
int fd = atoi( argv[1] ) - 0x1234;//把第二个命令行参数转成数字,再减0x1234
int len = 0;
len = read(fd, buf, 32);//以fd为文件描述符读取32个字节内容
if(!strcmp("LETMEWIN\n", buf)){//比较buf是否与"LETMEWIN\n"相等
printf("good job :)\n");
system("/bin/cat flag");//这里会输出flag文件的内容
exit(0);
}
printf("learn about Linux file IO\n");
return 0;
}
经过分析源码,我们可以知道,只需要让fd程序替我们把flag打印出来就行了,这里涉及到了linux用户特殊权限的问题,不懂的同学可以自行百度谷歌,或者点击这个链接,Linux系统中的文件的s权限。这里fd程序就拥有SGID权限,可以以fd组的权限运行,自然就能查看flag文件的内容。
那怎么才能让fd程序帮助我们查看flag的内容呢?我们先随便运行一下看看效果。
发现并没有什么卵用,还叫我们去了解一下Linux的文件IO,好吧,那就去学习一下,FILE I/O。
学习之后我们终于明白了,原来标准输入stdin的文件描述符是0,所以我们的命令行第二个参数应该是0x1234的十进制形式,也就是4660,然后就可以从标准输入,也就是键盘读取了,我们只需要再输入LETMEWIN,然后敲回车就可以看到flag了。
这里并没有用的我们前面学习资料里讲的知识,因为这只是第一个题,比较简单,是新手入门的,后面我们就会逐渐用到前面的知识了。