cgy12306

[pwnable.kr] mistake 본문

Wargame/pwnable.kr

[pwnable.kr] mistake

cgy12306 2020. 1. 26. 22:27

[mistake]

힌트를 보면 hint : operator priority 라고 적혀있다.

연산자 우선순위에 대한 문제인것 같다.

코드를 살펴보자.

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

연산자 우선순위에 의하면 부등호 연산자가 대입연산자보다 우선순위가 높다.

그래서 위의 코드는 부등호에 대한 연산을 먼저 수행하고 값을 대입을 하게 된다.

open 함수는 0과 -1을 반환하는데 성공을 하면 0을 반환하고, 실패하면 -1을 반환한다.

그래서 password 파일을 open에 성공하면 파일 디스크립터인 fd값이 0으로 설정이 되고, read 함수에서 pw_buf에 값을 넣게 된다.

다음 pw_buf2에 10byte 값을 넣고 각 글자를 1과 xor 연산을 해서 결과 값을 pw_buf와 비교를 한다.

그리고 같으면 /bin/cat flag 명령어를 실행한다.

xor 연산 특성 중에 a ^ 0 = a 라는 특성이 있다.

맨 처음 read 함수에서 1111111111을 입력하고, 두번째 입력 때 0000000000을 입력해서 xor 연산 결과를 1111111111로 만들 수 있다.

그러면 pw_buf와 pw_buf2가 같으니 flag를 출력할 것이다.


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

[pwnable.kr] passcode  (0) 2020.01.26
[pwnable.kr] shellshock  (0) 2020.01.26
[pwnable.kr] leg  (0) 2020.01.26
[pwnable.kr] flag  (0) 2020.01.26
[pwnable.kr] bof  (0) 2020.01.26
Comments