pwnable - input
Posted zhibin123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pwnable - input相关的知识,希望对你有一定的参考价值。
step by step
连接上,查看文件
input.c内容:
#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; }
看出来,要一关一关通过各种输入,然后可以执行system("/bin/cat flag")。
参考博客:https://r00tk1ts.github.io/2018/03/06/input/
然后在/tmp/input目录建立时,建立失败,原因是存在,所以进去看看,发现:
有文件,cat一下py,发现是这个题的payload,直接运行了一下,发现没问题,只差建立一个软链接:
ln -s /home/input2/flag flag
建立链接后,运行得到flag。
当然还是自己做做看
我的payload:
import os import socket import time import subprocess stdinr,stdinw = os.pipe() stderrr,stderrw = os.pipe() #argv args = list("a"*99) args[ord(‘A‘)-1] = "" args[ord(‘B‘)-1] = "\\x20\\x0a\\x0d" args[ord("C")-1] = "8888" #stdio os.write(stdinw,"\\x00\\x0a\\x00\\xff") os.write(stderrw,"\\x00\\x0a\\x02\\xff") #env envir = {"\\xde\\xad\\xbe\\xef":"\\xca\\xfe\\xba\\xbe"} #file f = open("\\x0a","w") f.write("\\x00"*4) f.close() pro = subprocess.Popen(["/home/input2/input"]+args,stdin=stdinr,stderr=stderrr,env=envir) #network s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) time.sleep(2) s.connect(("127.0.0.1",8888)) s.send("\\xde\\xad\\xbe\\xef") s.close()
在子进程中打开一个程序,并通过管道将父进程构造的参数传到子进程的程序中
使用到的知识:
subprocess:https://www.cnblogs.com/Security-Darren/p/4733368.html
以上是关于pwnable - input的主要内容,如果未能解决你的问题,请参考以下文章