블로그 이전했습니다. https://jeongzero.oopy.io/
[pwnable.kr] mistake
본문 바로가기
워게임/pwnable.kr

[pwnable.kr] mistake

728x90

1. 문제


#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;
}

힌트 : 연산자 우선순위 

 

 

2. 접근방법


...   
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;
        }
...

연산자 우선순위가 힌트다. 여기서 연산자 우선순위가 먹힐만한 곳은 정해져있다. 처음에 password 파일을 열고, 정상적이라면 fd=3에 할당받을것이다. 만약 그 값이 음수면 종료되는 예외처리가 있다. 헌데 연산자 우선순위에서 < 가 = 보다 더 높은 순위이므로 open() 결과인 3 < 0 이 먼저 연산된다. 

 

따라서 해당 연산결과는 false로 0이 나오게 되고 이 값을 fd에 넣어 if(0) 가 된다. 두번째로 아래 read함수 역시, read()의 반환값 즉, 입력 받은 값을 0과 비교하고, 양수면 이를 len에 넣는다. 

 

따라서 read()의 fd=0로 입력을 하기만 하면 에러는 안난다. fd=0이 됬으므로 사용자의 입력을 10개 받고, input password : 을 잘 맞춰주면 된다. 

 

1을 입력하면 이는 아스키로 0x31 이므로 0x31 ^ 1 = 0x30 을 이용해서 

  • 1 * 10
  • 0 * 10

을 입력해주면 된다. (여기서 1과 2는 scanf에서 %s로 입력받으므로 아스키값으로 xor 연산이 된다) 

 

 

3. 풀이


 

 

 

 

4. 몰랐던 개념


728x90

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

[pwnable.kr] md5 calculator  (0) 2020.09.23
[pwnable.kr] brainfuck  (0) 2020.09.23
[pwnble.kr] leg  (0) 2020.09.06
[pwnable.kr] shellshock  (0) 2020.09.06
[pwnable.kr] input  (0) 2020.09.06