首页 > 其他 > 详细

input

时间:2021-08-02 15:00:34      阅读:17      评论:0      收藏:0      [点我收藏+]

Mom? how can I pass my input to a computer program?

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

 

程序源码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main(int argc, char* argv[], char* envp[]){
        printf("Welcome to pwnable.kr\n");
        printf("Let‘s see if you know how to give input to program\n");
        printf("Just give me correct inputs then you will get the flag :)\n");

        // argv
        if(argc != 100) return 0;
        if(strcmp(argv[A],"\x00")) return 0;
        if(strcmp(argv[B],"\x20\x0a\x0d")) return 0;
        printf("Stage 1 clear!\n");

        // stdio
        char buf[4];
        read(0, buf, 4);
        if(memcmp(buf, "\x00\x0a\x00\xff", 4)) return 0;
        read(2, buf, 4);
        if(memcmp(buf, "\x00\x0a\x02\xff", 4)) return 0;
        printf("Stage 2 clear!\n");

        // env
        if(strcmp("\xca\xfe\xba\xbe", getenv("\xde\xad\xbe\xef"))) return 0;
        printf("Stage 3 clear!\n");

        // file
        FILE* fp = fopen("\x0a", "r");
        if(!fp) return 0;
        if( fread(buf, 4, 1, fp)!=1 ) return 0;
        if( memcmp(buf, "\x00\x00\x00\x00", 4) ) return 0;
        fclose(fp);
        printf("Stage 4 clear!\n");

        // network
        int sd, cd;
        struct sockaddr_in saddr, caddr;
        sd = socket(AF_INET, SOCK_STREAM, 0);
        if(sd == -1){
                printf("socket error, tell admin\n");
                return 0;
        }
        saddr.sin_family = AF_INET;
        saddr.sin_addr.s_addr = INADDR_ANY;
        saddr.sin_port = htons( atoi(argv[C]) );
        if(bind(sd, (struct sockaddr*)&saddr, sizeof(saddr)) < 0){
                printf("bind error, use another port\n");
                return 1;
        }
        listen(sd, 1);
        int c = sizeof(struct sockaddr_in);
        cd = accept(sd, (struct sockaddr *)&caddr, (socklen_t*)&c);
        if(cd < 0){
                printf("accept error, tell admin\n");
                return 0;
        }
        if( recv(cd, buf, 4, 0) != 4 ) return 0;
        if(memcmp(buf, "\xde\xad\xbe\xef", 4)) return 0;
        printf("Stage 5 clear!\n");

        // here‘s your flag
        system("/bin/cat flag");
        return 0;
}

当输入全部正确时会给flag

第一部分是传参,其中argc为传入参数的总数,argv为具体的参数列表

题目要求传入100个参,其中argv[‘A‘]这种表示方法会把‘A‘用ascii码表示,也就是argv[65]为‘\x00‘,argv[66]为‘\x20\x0a\x0d‘

第二部分是标准输入输出流,要求从标准输入流里输入‘\x00\x0a\x00\xff‘,从标准错误流里输入‘\x00\x0a\x02\xff‘,我们可以通过重定向处理这部分

第三部分是环境变量,要求存在一个环境变量‘\xde\xad\xbe\xef‘,其值为‘\xca\xfe\xba\xbe‘

第四部分是文件读入,要求从‘\x0a‘文件读入‘\x00\x00\x00\x00‘,由于远程存在着权限限制,因此可以考虑在环境变量中传入PWD,也就是当前工作目录,更改为我们有权限的目录

第五部分是网络传输,程序会绑定本机的argv[67]位置的端口,要求从此处读入‘\xde\xad\xbe\xef‘,用pwntools的remote就可以实现

但是因为我们传入了PWD,因此当前工作目录下没有了flag文件,我们需要建立软链接

同时因为tmp文件夹没有读权限,因此需要在它下面新建子文件夹,然后ln -s /home/input2/flag flag

exp如下:

from pwn import *

arg = list(a * 100)
arg[ord(A)] = \x00
arg[ord(B)] = \x20\x0a\x0d
arg[ord(C)] = 1234

f1 = open(1.txt, w)
f1.write(\x00\x0a\x00\xff)
f1.close()
f1 = open(1.txt, r)

f2 = open(2.txt, w)
f2.write(\x00\x0a\x02\xff)
f2.close()
f2 = open(2.txt, r)

envir = {\xde\xad\xbe\xef: \xca\xfe\xba\xbe, PWD: ‘/tmp/hktk}

f3 = open(\x0a, w)
f3.write(\x00 * 4)
f3.close()

io = process(argv = arg, executable = /home/input2/input, stdin = f1, stderr = f2, env = envir)

p = remote(127.0.0.1, 1234)
p.send(\xde\xad\xbe\xef)

io.interactive()

 

input

原文:https://www.cnblogs.com/hktk1643/p/15089389.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!