힌트로 연산자 우선순위가 주어졌습니다.



홈에는 평소와 다르게 password라는 파일도 있습니다. 


소스파일을 살펴보겠습니다.

#include 
#include 

#define PW_LEN 10
#define XORKEY 1

void xor(char* s, int len){
        int i;
        for(i=0; i 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");
        }

소스코드 의도대로라면  /home/mistake/password 파일에서 10바이트 받아와 pw_buf 배열에 입력하고,

사용자로부터 입력받은 10바이트를 pw_buf배열에 입력한 후

1과 xor연산을 해 pw_buf와 같으면 /bin/flag를 출력할 수 있도록 쉘을 딸 수 있습니다.

하지만 /home/mistake/password 파일을 권한이 없어서 읽을 수 없으므로 gdb를 이용해 풀으려고 했으나

이 방법으로 풀리지 않았습니다.


hint인 연산자 우선순위를 key word로 코드를 자세히 살펴보면

open함수와 read함수가 있는 곳이 약간 이상하다는것을 확인할 수 있습니다.

먼저 open함수가 있는 라인에서 if문을 보면 = 과 < 이 같이 있는데 이 둘의 우선순위는 <이 높습니다.

우선순위를 따져서 코드를 읽으면 open함수는 양수를 반환하고 양수 < 0 이 되므로 fd에는 false가 입력됩니다.

read함수가 있는 부분도 마찬가지로 우선순위가 의도한바와 다르게 되어있습니다.

근데 전에 fd에는 false가 입력되었고 이 값은 파일디스크립터 0이됩니다.

결국 사용자가 입력한 값을 읽어들입니다.


그럼 미리 xor될 값을 알게되므로 먼저 1111111111 을 입력합니다. 이 값은 pw_buf배열에 들어갈 것 입니다.

두번째로 (어떠한 값) XOR 1 = 1111111111 이란 식이 성립하므로

(어떠한 값) = 1111111111 XOR 1 = 0000000000 이므로 두번째입력에는 0000000000을 입력합니다.



'Wargame > pwnable.kr' 카테고리의 다른 글

pwnable.kr coin1  (0) 2018.02.19
[pwnable.kr] shellshock 1p  (0) 2016.08.20
[pwnable.kr] uaf 8p  (0) 2016.08.15
[pnwable.kr] random 1pt  (0) 2016.07.29
[pwnable.kr] passcode 10p  (0) 2016.07.29

+ Recent posts