[Pwnable.kr] mistake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/* mistake.c */
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;
}
 
cs



코드를 대충 읽으면 /home/mistake/password와 입력한 값을 비교하는 것으로 생각할 수 있지만 연산자 우선순위 때문에 의도한대로 동작하지 않습니다. 5번 줄

fd=open("/home/mistake/password",O_RDONLY,0400< 0

에서 부등호가 등호보다 우선순위가 높으므로 fd에는 0이 저장됩니다. 0은 표준 입력이므로 의도한대로 /home/mistake/password를 읽어오는게 아니라 표준 입력을 읽어서 pw_buf에 저장합니다. 그러므로 ASCII CODE 상에서 최하위비트가 다른 아무 문자열이나 대입하면 password를 얻을 수 있습니다.(000000000 / 11111111 or BBBBBBBBB / CCCCCCCCC ...)





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

[Pwnable.kr] blackjack  (0) 2018.01.15
[Pwnable.kr] coin1  (3) 2018.01.15
[Pwnable.kr] shellshock  (0) 2018.01.15
[Pwnable.kr] leg  (0) 2018.01.15
[Pwnable.kr] input  (0) 2018.01.15
[Pwnable.kr] random  (0) 2018.01.15
  Comments