write-ups/pwnable.kr

pwnable.kr mistake write up

2017. 7. 4. 22:37

pwnable.kr mistake write up

H3X0R팀 소속 BoB 6기 ch4n3



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


위 소스는 pwnable.kr의 mistake 문제의 소스이다. 악악! 시험기간인데 pwnable.kr을 풀고있다.

일단 이 문제의 힌트는 operator priority 이다. 연산자 우선순위. 
나는 디미고에서 프로그래밍 수행평가를 보면서 대충은 외워놓은 상태였지만, 이 문제에서는 꽤 논리적인 혼란이 왔다. 

일단, 결과적으로 말하자면 
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)

이 부분에서 취약점이 발생한다. > (비교 연산자)가 = (대입 연산자) 보다 우선순위가 높기 때문이다. 

/home/mistake/password 파일이 있으니까 open() 함수에서는 양수를 반환한다. (open() 함수의 반환값은 http://pubs.opengroup.org/onlinepubs/009695399/functions/open.html 여기서 확인했다.) 그리고 '양수 < 0' 를 비교하는데 중학교 과정만 이수했다면 이 조건은 false라는 것을 알 것이다. 그리고 fd 에는 0 이라는 value가 들어가게 된다. 



pwnable.kr toddler에서 fd 문제에서 풀었듯이, 0은 표준 입력이다. 그래서 우린 read(fd,pw_buf,PW_LEN) 이 부분에서 pw_buf 에 값을 입력할 수 있게 되었다. wow~



따라서 우리는 pw_buf와 pw_buf2 변수 모두 조작할 수 있기 때문에 프로그램의 흐름을 잡을 수 있다. 


xor() 함수는 직접 구현해보았다. 



그리고 다시 mistake 프로그램을 실행시켜서 얻은 값을 대입해본다~



플래그를 얻었다. 내일 시험인데 기분이 좋다.

'write-ups > pwnable.kr' 카테고리의 다른 글

pwnable.kr blackjack write up  (0) 2017.07.05
pwnable.kr cmd1 write up  (0) 2017.07.05
pwnable.kr random write up  (0) 2017.07.04
pwnable.kr passcode write up  (0) 2017.07.04
pwnable.kr flag write up  (0) 2017.07.04