DongDD's IT

[pwnable.kr] fd 본문

Wargame/pwnable.kr

[pwnable.kr] fd

DongDD 2018. 3. 1. 14:37

[pwnable.kr] fd



Problem



Linux의 file descriptor가 무엇인지 묻고 있는 문제였다.

fd와 관련된 내용이 나올 것 같다는 생각이 들었다.



ssh로 fd@pwnable.kr에 접속하니 위와 같은 화면을 볼 수 있었다.

fd 실행파일과 fd.c 소스 코드 파일과 flag 파일이 있었다.

먼저 소스 코드를 확인해 보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
int main(int argc, char* argv[], char* envp[]){
        if(argc<2){
                printf("pass argv[1] a number\n");
                return 0;
        }
        int fd = atoi( argv[1] ) - 0x1234;
        int len = 0;
        len = read(fd, buf, 32);
        if(!strcmp("LETMEWIN\n", buf)){
                printf("good job :)\n");
                system("/bin/cat flag");
                exit(0);
        }
        printf("learn about Linux file IO\n");
        return 0;
 
}
 
cs

32 bytes의 buf가 전역 변수로 선언되어있었고 (argc < 2)이면 프로그램이 종료되기 때문에 argv를 1개 이상 받아야 한다. 받은 argv[1]을 atoi로 int형으로 바꿔주고 0x1234를 뺀 값을 fd에 넣어준다.

그 후에 read(fd, buf, 32)를 통해 fd로 부터 32 bytes만큼을 buf에 입력받는다.

buf가 "LETMEWIN"이라면 if문으로 들어가 system("/bin/cat flag")를 실행시켜 flag를 알려주는 형식으로 되어 있는 프로그램이었다.


Solution


1. fd를 stdin(0)으로 조작


File descriptor : 특정 파일에 대한 접근을 하기 위한 handle로 사용되는 키


먼저 Linux 시스템에서 기본적으로 설정되어 있는 file descriptor는 3가지가 있다.



stdin(0) : 사용자에게 입력을 받음

stdout(1) : 출력으로 사용자에게 보여줌 

stderr(2) : 에러로서 사용자에게 보여줌


이 문제에서는 read를 통해 buf에 "LETMEWIN"을 넣어야하기 때문에 file descriptor를 조작해야한다. open이라던지 file descriptor를 생성하는 것이 없기 때문에 stdin으로 fd 값을 조작하여 입력을 받을 수 있다.


fd = stoi(argv[1]) - 0x1234의 값이 0이 되게 해야하므로 stoi(argv[1]) = 0x1234가 되는 값을 찾아야 한다.



python을 이용해 0x1234의 10진수 값을 찾았다.


0x1234의 10진수 : 4660


이 값을 fd 파일의 argument로 넣어주어 실행하면 입력을 받을 수 있게 되고 입력으로 "LETMEWIN"을 입력해 flag를 얻어낼 수 있었다.







**************     Answer & Flag     **************




1. fd를 stdin(0)으로 조작




argv[1]에 4660을 넣어주고 stdin으로 "LETMEWIN"을 넣어 flag를 획득했다.


Flag : mommy! I think I know what a file descriptor is!!






'Wargame > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] flag  (0) 2018.03.09
[pwnable.kr] bof  (0) 2018.03.07
[pwnable.kr] collision  (0) 2018.03.02
[pwnable.kr] lotto 문제 풀이  (0) 2017.08.27
[pwnable.kr] cmd1 문제 풀이  (0) 2017.08.12
Comments