pwnable

发布于: 2024-08-16 00:39

pwnable.kr wp

刷下pwnable学习pwn

fd 文件描述符

kali ssh连接靶机

ssh fd@pwnable.kr -p2222

列出文件

fd@pwnable:~$ ls -l
total 16
-r-sr-x--- 1 fd_pwn fd   7322 Jun 11  2014 fd
-rw-r--r-- 1 root   root  418 Jun 11  2014 fd.c
-r--r----- 1 fd_pwn root   50 Jun 11  2014 flag

查看当前用户,当前用户既不属于fd_pwn,也不上root,没有权限查看flag。

fd@pwnable:~$ id
uid=1002(fd) gid=1002(fd) groups=1002(fd)

查看fd文件属性,是一个二进制可执行文件。fd可以查看fd.c和执行fd文件

fd@pwnable:~$ file fd
fd: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=c5ecc1690866b3bb085d59e87aad26a1e386aaeb, not stripped

查看源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
// argc 是命令行参数的数量。
// argv 是一个字符串数组,包含命令行参数。
// envp 是一个环境变量的字符串数组
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;
    // fd=0 表示标准输入
    // 1 表示标准输出
    // 2 表示错误输出
    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;
}

分析可知,fd文件需要传入一个参数,参数的值减去0x1234(十进制4660)后,作为文件描述符,读取32个字节到buf中,如果buf中内容为"LETMEWIN\n",则输出flag。

exp

./fd 4660