pwnable part1 溢出研究

这里有个视频是讲过程的,但是都是英文。。。
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=blAxTfcW9VU

ssh fd@pwnable.kr -p2222 (pw:guest)

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

fd@ubuntu:~$ ls -il
total 16
1578052 -r-sr-x--- 1 fd_pwn fd   7322 Jun 11  2014 fd
1578049 -rw-r--r-- 1 root   root  418 Jun 11  2014 fd.c
1578050 -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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值