[1pt]mistake

Pwnable.kr 2015. 8. 6. 22:20
#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;
}


Introduction: 

 본 문제 에서는 프로그램이 password파일을 읽어 pw_buf에 대입하고, 사용자로 부터 pw_buf2의 값을 입력 받아 비밀번호를 검증하는 문제처럼 보인다. 코드를 보면 password의 값과 XORKEY문자가 xor연산된 결과값을 알아내 입력해야 되는 것 처럼 보이나 실제로 프로그램을 실행해 보면 pw_buf에 들어가는 값은 password문서의 내용이 아니라 사용자로 부터 입력된 값이다. 


How to solve: 

 프로그램에서는 사용자로부터 입력받은 10글자를 xor함수로 보내어 XORKEY와 xor연산을 수행한다. 즉, 프로그램을 실행해 첫 번째 표준입력에 XORKEY0000을 입력하면 이 값은 pw_buf에 저장된다. 이 때 두 번째 표준입력에는 YNSJDX1111를 입력하게 되면 xor함수를 통해 XORKEY ^ YNSJDX1111을 수행한 결과값, "XORKEY0000이 pw_buf2에 저장되고, 이 값은 첫 번째 표준입력을 통해 pw_buf에 저장된 값과 일치하므로 프로그램은 flag의 내용을 출력해준다. 


Command line: 

mistake@ubuntu:~$ ./mistake 

do not bruteforce... 

XORKEY0000 

input password : YNSJDX1111 

Password OK 

Mommy, ~!@#$%^&*()_+~!@#$%^&*()_+~!@#$%^&*()_+


Appendix:



'Pwnable.kr' 카테고리의 다른 글

[4pt]input  (0) 2015.08.15
[3pt]collision  (0) 2015.08.07
[1pt]cmd1  (0) 2015.08.06
[1pt]fd  (0) 2015.08.06
[5pt]bof  (0) 2015.08.06
Posted by Hugh_K
l