[pwnable.kr] input

문제


암호

#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; }

깃발을 얻으려면 5단계를 통과해야 하는 것 같습니다.

1단계부터 시작하겠습니다.

스테이지 1

// 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");

– 요인의 수는 100개입니다.

– 인수(‘A’) = \x00

– 인수(‘B’) = \x20\x0a\x0d

‘A’번째 인수 \x00과 ‘B’번째 인수 \x20\x0a\x0d를 ASCII 코드로 생성하면 통과됩니다.

from pwn import *

argv = ("A" for i in range(100))
argv(65) = "\x00"
argv(66) = "\x20\x0a\x0d"

p = process(executable="/home/input2/input" ,argv=argv)
p.interactive()

– 추후 작성 예정 –