#include <stdio.h>
#include <fcntl.h>

#define PW_LEN 10
#define XORKEY 1

void xor(char* s, int len){
    int i;
    for(i=0; i<len; i++){
        s[i] ^= XORKEY;
    }
}

int main(int argc, char* argv[]){

    int fd;
    if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
        printf("can't open password %d\n", fd);
        return 0;
    }

    printf("do not bruteforce...\n");
    sleep(time(0)%20);

    char pw_buf[PW_LEN+1];
    int len;
    if(!(len=read(fd,pw_buf,PW_LEN) > 0)){
        printf("read error\n");
        close(fd);
        return 0;        
    }

    char pw_buf2[PW_LEN+1];
    printf("input password : ");
    scanf("%10s", pw_buf2);

    // xor your input
    xor(pw_buf2, 10);

    if(!strncmp(pw_buf, pw_buf2, PW_LEN)){
        printf("Password OK\n");
        system("/bin/cat flag\n");
    }
    else{
        printf("Wrong Password\n");
    }

    close(fd);
    return 0;
}

How to Exploit

언뜻 보면 password를 모르는데 어떻게 풀지라고 생각할 수 있지만, read 함수를 이상하게 쓰고 있다. read에서 우리가 직접 pw_buf에 입력을 주므로 pw_buf 준값에 XOR 1한 값을 pw_buf2로 주면 된다.

0x42(='B') ^ 1 = 0x43 (='C')이므로 pw_buf에 B 주고 pw_buf2에 C 주자. write-up 쓰기도 부끄러울 정도에 쉬운 문제. 아 겸손해야지

Capture The Flag

image

'Writeup [pwn] > pwnable.kr' 카테고리의 다른 글

Random  (0) 2020.03.07
passcode  (0) 2020.03.07
memcpy  (0) 2020.03.07
lotto  (0) 2020.03.07
leg  (0) 2020.03.07

+ Recent posts