본문 바로가기

워게임/pwnable.kr

input

stage1부터.. 배열에 그냥 아무 값도 안넣으니까 argv['A'] 체크는 걍 해결됐고, 같은 방식으로 B,C(마지막 스테이지)도 해결.


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <sys/socket.h>

#include <arpa/inet.h>


int main () {


//stage 1

    char *argv[101] = {[0 ... 99] = ""};

    char *envp[] = {"\xde\xad\xbe\xef=\xca\xfe\xba\xbe", NULL}; //stage 3

    argv['B'] = "\x20\x0a\x0d";

    argv['C'] = "11111";


    //stage 2

    int pipe1[2], pipe2[2];

   

    if(pipe(pipe1)==-1 || pipe(pipe2)==-1) {

        exit(1);

    }


    //child

    if(fork() == 0) {

        dup2(pipe1[0], 0);

        close(pipe1[0]);

        close(pipe1[1]);


        dup2(pipe2[0], 2);

        close(pipe2[0]);

        close(pipe2[1]);


        execve("/home/input/input", argv, envp);

    }


    //parent

    else {

        write(pipe1[1], "\x00\x0a\x00\xff", 4);

        write(pipe2[1], "\x00\x0a\x02\xff", 4);


   //stage 4

   FILE* fp = fopen("\x0a", "w");

   fwrite("\x00\x00\x00\x00", 4, 1, fp);

   fclose(fp);


   //stage 5

        sleep(3);

int client_socket = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr_in server_addr;


if(client_socket == -1)

{

 printf("socket err\n");

 exit(1);

}


memset(&server_addr, 0, sizeof(server_addr));


server_addr.sin_family      = AF_INET;

server_addr.sin_port        = htons(atoi(argv['C']));

server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");


if(-1 == connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)))

{

 printf("conn failed\n");

 exit(1);

}


send(client_socket, "\xde\xad\xbe\xef", 4, 0);


    }

}


하고 /tmp/extr에 ln -s로 flag 파일 심볼릭링크 생성함



'워게임 > pwnable.kr' 카테고리의 다른 글

bof  (0) 2015.10.30
leg  (0) 2015.10.30
col  (0) 2015.10.30
mistake  (0) 2015.10.30
fd  (0) 2015.10.30