gunnew의 잡설

pwnable.kr 9. mistake (Operator priority) 본문

System Security

pwnable.kr 9. mistake (Operator priority)

higunnew 2020. 2. 12. 19:14
반응형

 이번 것은 굉장히 쉬웠다. 그러나 이전에 트라우마(?)가 있어 gdb로 뜯어보다가 시간만 날렸다. 결론부터 말하면 그냥 C파일만 봐도 된다. 왜냐하면 힌트에 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");
                                                              1,1           Top

       

        if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
                printf("can't open password %d\n", fd);
                return 0;
        }

 

여기서 fd에 open이 들어가는 것이 아니라 open( ~~ ) < 0이 우선 순위가 높기 때문에 이것이 먼저 연산된다. open이 정상적으로 되기 때문에 이 값은 false가 되고 fd에는 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;
        }

 

방금 fd = 0이라는 것을 알 수 있었다. read(fd, pw_buf, PW_LEN)에서 fd가 0이므로 표준 입력을 통해 pw_buf에 값을 입력할 수 있다. 여기서 간단하게 0000000000 (0은 0x30)을 대입하자. 그 이유는 차후 설명


        char pw_buf2[PW_LEN+1];
        printf("input password : ");
        scanf("%10s", pw_buf2);

 

        // xor your input
        xor(pw_buf2, 10);


이제 우리는 pw_buf2에 길이 10인 string을 입력할 것이다. 그리고 이 문자열에 

#define XORKEY인 1을 전부 XOR 해 줄 것이다.

 

자 근데 1은 0x01이다. 따라서 pw_buf에는 0x30이 10개 있고, pw_buf2에는 어떤 값에다가 0x01을 XOR 한 값이 들어가 있을 것이다. 이 둘이 같으려면 처음에 pw_buf2에 뭐가 들어가야 할까?

 

당연히 0x31이 들어가야 할 것이다. 0x31과 0x01을 XOR하면 0x30이 나오기 때문이다. 이러한 이유로 pw_buf에 0000000000을 대입한 것이다. 짝수 값이 들어가 있어야 편하기 때문이다.

따라서 pw_buf2에는 1111111111이 들어가면 될 것이다.

 

끝.

반응형

'System Security' 카테고리의 다른 글

pwnable.kr 11. coin1  (0) 2020.02.16
pwnable.kr 10. shellshock  (0) 2020.02.14
pwnable.kr 8. leg (ARM Assembly)  (0) 2020.02.12
pwnable.kr 7. input (Various I/O in Linux)  (0) 2020.02.06
pwnable.kr 6. random  (0) 2020.02.05
Comments