System/PWNABLE

[pwnable.kr / Toddler's Bottle] fd

728x90

✏️ Check


문제에서 제공하는 ssh 로 접속하면 fd 문제 파일과 fd.c 소스코드 파일, 읽기 권한이 없는 flag 파일이 저장되어 있다.

 

🔎 Analyze


        if(argc<2){
                printf("pass argv[1] a number\n");
                return 0;
        }
        int fd = atoi( argv[1] ) - 0x1234;

문제에서 제공한 소스코드를 확인해보면, argv[1] 를 가장 먼저 입력받는다.

입력받은 값은 문자열로 저장이 되고, 이를 atoi 함수를 통해 integer 값으로 변환하여 0x1234만큼 뺀 값을 fd 변수에 저장한다.

        int len = 0;
        len = read(fd, buf, 32);
        if(!strcmp("LETMEWIN\n", buf)){
                printf("good job :)\n");
                system("/bin/cat flag");
                exit(0);
        }

앞서 저장한 fd 값은 read 함수에서 그대로 file descriptor로 사용된다.

* file descriptor
Unix 운영체제에서 파일이나 기타 입출력 자원에 접근할 때 사용하는 추상적인 표현이다.

주로 C 언어에서 integer(int) 유형으로 사용된다. 

그 중에서도 0부터 2까지의 3 개의 정수 값은 그 의미가 고정되어 있다.
Integer Value Name <stdio.h> file stream
0 standard input stdin
1 standard output stdout
2 standard error stderr

그렇다면 사용자로부터 표준입력을 받음으로 실행흐름을 조작할 수 있으므로 (buf 변수에 직접 값을 쓸 수 있음) fd의 값이 0이 될 수 있도록 한다.

 

🔓 Exploit


0x1234를 decimal value로 바꿔주면 4660이 된다.

4660을 fd 파일의 인자로 전달하면 read 함수를 통해 buf 변수에 사용자로부터 표준입력을 받을 수 있게 되고, 이 때 "LETMEWIN"을 입력하면 flag를 출력할 수 있게 된다.

SMALL

'System > PWNABLE' 카테고리의 다른 글

[pwnable.xyz] add  (0) 2021.05.12
[HackCTF] Register  (0) 2021.04.29
[ROP Emporium] write4 (재)  (0) 2021.04.17
[HackCTF] Unexploitable_1  (0) 2021.04.17
[ROP Emporium] callme  (0) 2021.04.02