pwnable part1 溢出研究

来源:互联网 发布:国外mac破解软件网站 编辑:程序博客网 时间:2024/05/17 04:36

这里有个视频是讲过程的,但是都是英文。。。
part1

pwnable第一题的题目是这样的

Mommy! what is a file descriptor in Linux?* try to play the wargame your self but if you are ABSOLUTE beginner, follow this tutorial link: https://www.youtube.com/watch?v=blAxTfcW9VUssh fd@pwnable.kr -p2222 (pw:guest)

我们连上那个ssh
ls -il看一下

fd@ubuntu:~$ ls -iltotal 161578052 -r-sr-x--- 1 fd_pwn fd   7322 Jun 11  2014 fd1578049 -rw-r--r-- 1 root   root  418 Jun 11  2014 fd.c1578050 -r--r----- 1 fd_pwn root   50 Jun 11  2014 flag

有三个文件,然后我们要的是flag的信息,然后主要就是要用fd这个可执行文件去溢出攻击系统,然后获得flag

看到fd文件属性那个组属性,刚好组属性可以执行,我们用户名是fd刚刚包括fd这个文件,所以我们可以执行这个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){        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;}

这个学过C语言的同学都知道,这个argc是保存参数的数量的参数,argv[]则是保存参数具体值的数组,然后这个envp不是很常见,是存放系统的环境变量的数组。

if(argc<2){        printf("pass argv[1] a number\n");        return 0;    }

如果参数的数量小于2,就输出那个字符串,然后返回0退出。

int fd = atoi( argv[1] ) - 0x1234;

这是把第一个参数 按字符串转换成整型数,然后减去0x1234,得到fd的值

len = read(fd, buf, 32);

然后从fd指向的文件读取32字节的数据放在buf中。

他题目中说的file descriptor就是文件句柄的意思,也就是打开一个文件系统返回的对这个文件的唯一标识符。

if(!strcmp("LETMEWIN\n", buf)){        printf("good job :)\n");        system("/bin/cat flag");        exit(0);    }

然后这个strcmp比较字符串”LETMEWIN\n”和buf中的数据,如果相同,返回0,如果“LETMEWIN\n”大于buf中的数据,返回大于0数,反正返回小于0的数,要使这句话生效,要么相等返回0,然后非0得1,要么小于,这个小于的也好构造,把L改成L之前的任何一个数都行,

system("/bin/cat flag");

调用系统调用,来输出flag

fd呢是拥有者是fd_pwn,而flag的拥有者也是fd_pwn,所以这个时候这个代码执行后是有权限打开flag的。

然后我们怎么去改这个buf的内容呢,buf是从fd中读进去的数据,所以我们要改fd,要让fd读取我们的输入,这里就是linux的io接口知识 了。

即标准输入文件(stdin):通常对应终端的键盘;
标准输出文件(stdout):通常对应屏幕
标准错误输出文件(stderr):也是对应屏幕

这三个的文件描述符也就是文件句柄是0,1,2

stdin->0
stdout->1
stderr->2

我们将文件句柄对准我们的键盘,就是让fd为0
我们输入0x1234看看

不行,0x是16进制的意思,我们把16进制换成10进制看看
换成十进制是4660

./fd 4660

就可以让fd指向我们的键盘,然后输入那个letmewin然后回车,就可以了

0 0
原创粉丝点击