简介
PWN是CTF中的一种题目,利用溢出等等攻击手段达到入侵设备的一个简称,不必深究它到底是什么意思,学完下面这个网站上的几道题目,自然就懂了。
练习网站:?http://pwnable.kr/play.php
打开网站第一题(fd)。
看到有一个ssh fd@pwnable.kr -p 2222 密码是:guest,我们先连接过去。
查看一下目录有什么内容,如下图,看到有三个文件,fd , fd.c , flag。
由权限可知道,我们不能读取flag文件,题目思路尝试执行fd,查看fd.c 进行读取flag。
查看源码:
- #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;
- }
从源码分析,可知,这个程序接收一个参数argv[1],这个参数转换成整数int型,然后减去0x1234,然后读入buf,输入:LETMEWIN,进行字符串比较,如果正确就读入flag这个文件。
- stdin 0 标准输入
- stdout 1 标准输出
- stderr 2 标准错误输出
所以我们只有让fb 等于0 再想buf里面写入我们相要写的内容LETMEWIN,然后就成功了。
怎么让fb 为 0 呢?
fd = atoi( argv[1] ) – 0x1234;
所以只要把我们的输入的值为0x1234就可以了,输入对应的十进制4660即可。
总结
- 先运行程序。
- 查看源码。
- 找到溢出点。
- 输入对应字符。
- 获取flag。