본문 바로가기
[ ★ ]Study/War Game

[Toddler's Bottle] pwnable.kr mistake 풀이

by nroses-taek 2017. 9. 15.
반응형

<문제의 코드>
 
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
40
41
42
#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;
}
cs
 
풀이를 시작해봅시다.
 
hint 연산자 우선순위라고 되어있습니다.
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
printf("can't open password %d\n", fd);
return 0;
}
부분을 자세히 봅시다.
if문은 open 반환 값을 fd 넣고 그것을 0 비교를 하는 것인데, 벌써 잘못되었죠? 원래대로라면 if((fd=open@@@@@@@, 400)) < 0 ){} 되어야 합니다.
 
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;                
}
 
부분에서도 fd 값은 반환된 0으로 들어가게 되면서 표준 입력을 하게 됩니다.
때문에 코드는 원래의 목적( password 읽어와 pw_buf 저장) 아니라, 저희가 pw_buf 변수에 값을 넣을 있도록 되었습니다.
 
때문에, pw_buf, pw_buf2 모두 우리의 것입니다.
 
 
xor 함수를 보면 pw_buf2 인덱스의 xor 1 해주고 있습니다.
 
그럼 정답은 아주 쉽게 나오겠죠 ?


반응형

댓글