ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Toddler's Bottle] blukat write up
    System hacking training/pwnable.kr 2018. 11. 15. 23:34
    오랜만에 머리도 식힐겸 pwnable.kr toddler 문제를 잡았습니다.



    요로쿵 생긴 귀여운 친구에용

    Sometimes, pwnable is strange...
    hint: if this challenge is hard, you are a skilled player.

    ssh blukat@pwnable.kr -p2222 (pw: guest)

    많이 쉬운 문제였습니다.
    어렵게 생각해서 문제지...ㅎ

    blukat@ubuntu:~$ cat blukat.c
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <fcntl.h>
    char flag[100];
    char password[100];
    char* key = "3\rG[S/%\x1c\x1d#0?\rIS\x0f\x1c\x1d\x18;,4\x1b\x00\x1bp;5\x0b\x1b\x08\x45+";
    void calc_flag(char* s){
        int i;
        for(i=0; i<strlen(s); i++){
            flag[i] = s[i] ^ key[i];
        }
        printf("%s\n", flag);
    }
    int main(){
        FILE* fp = fopen("/home/blukat/password", "r");
        fgets(password, 100, fp);
        char buf[100];
        printf("guess the password!\n");
        fgets(buf, 128, stdin);
        if(!strcmp(password, buf)){
            printf("congrats! here is your flag: ");
            calc_flag(password);
        }
        else{
            printf("wrong guess!\n");
            exit(0);
        }
        return 0;
    }

    blukat의 소스코드입니다.
    간단히 설명을 하자면 main()에서 fopen()로 password 파일을 읽어옵니다.
    여기서 읽어온 값을 password라는 전역 변수에 넣고, 사용자로 부터 입력을 받고, 둘의 값이 같다면 strcmp()의 return 값이 0으로 return 되고, if문의 조건을 만족하게 됩니다.(여기서는 !(부정)이기 때문에 만족을 하게 되고 분기하게 되죠.)

    이후 calc_flag() 함수로 분기하여 xor 연산을 마치고 이 값을 flag로 출력해줍니다.

    여기서 저는 password에서 값을 읽어올 때 메모리상에 남아있을것이라고 생각을 했고
    디버깅을 시작했습니다.

    그래서 password 파일을 읽어온 후 strcmp()를 통해 사용자의 input값과 password를 비교하는 부분에 bp를 걸고 확인을 한 결과



    이 처럼 argv[0]에는 password 파일에서 읽어온 값, argv[1]에는 제가 입력한 값을 확인 할 수 있었습니다.
    보시다시피 cat : password: Permission denied 라는 문자열이 들어있었습니다.


    >>> len("3\rG[S/%\x1c\x1d#0?\rIS\x0f\x1c\x1d\x18;,4\x1b\x00\x1bp;5\x0b\x1b\x08\x45+")
    33
    >>> len("cat: password: Permission denied\n")
    33

    두 문자열의 길이가 같은것으로 보아 정확한 값을 찾았구나 하고 확신할 수 있었습니다.

    이제 인증을 하면 되겠죠..ㅎ

    blukat@ubuntu:~$ ./blukat
    guess the password!
    cat: password: Permission denied
    congrats! here is your flag: **********************



    [여담]
    blukat@ubuntu:~$ id
    uid=1104(blukat) gid=1104(blukat) groups=1104(blukat),1105(blukat_pwn)
    blukat@ubuntu:~$ ls -al
    total 36
    drwxr-x---  4 root blukat     4096 Aug 15 22:55 .
    drwxr-xr-x 93 root root       4096 Oct 10 22:56 ..
    -r-xr-sr-x  1 root blukat_pwn 9144 Aug  8 06:44 blukat
    -rw-r--r--  1 root root        645 Aug  8 06:43 blukat.c
    dr-xr-xr-x  2 root root       4096 Aug 15 22:55 .irssi
    -rw-r-----  1 root blukat_pwn   33 Jan  6  2017 password
    drwxr-xr-x  2 root root       4096 Aug 15 22:55 .pwntools-cache
    blukat@ubuntu:~$

    이상 풀이를 마칩니다.
    반응형
Designed by Tistory.