본문 바로가기
포너블(pwnable)/CTF(pwnable.kr)

[Toddler's Bottle] fd 문제풀이

by LIZ0904 2021. 3. 20.
반응형

문제

첫번째 포너블 문제는 위와 같다!

 

 

 

문제 접속

칼리 리눅스를 통해 ssh fd@pwnable.kr -p2222를 입력한 뒤, 비밀번호 guest도 입력하고 나면 접속이 된다.

 

 

ls -l

ls -l을 통해 현재 디렉토리에 있는 파일들을 확인해봤다.

 

 

flag 파일 확인

cat 명령어를 이용해 flag 파일을 보려 했지만, 예상대로 Permission denied가 떴다.

 

 

fd.c

cat 명령어를 이용해 fd.c 파일의 내용도 확인해보았다. 이 코드를 잘 해석해서 fd 실행파일에 인자값을 제대로 넣어야 문제가 풀릴 것 같다.

 

 

 

if(argc<2){
	printf("pass argv[1] a number\n");
    return 0;
}

fd 파일에 주어진 인자값이 ./fd 명령을 포함해 2개 미만이라면 return 0으로 종료된다.

 

 

int fd=atoi(argv[1]) - 0x1234;

atoi("문자열")는 문자열을 숫자(정수 타입(으로 반환해주는 함수다. 즉 '문자 1'을 '숫자 1'로 바꿔주는 역할을 한다. 위 명령에서 인자값 argv[1]을 숫자로 바꾼 뒤, 0x1234 (10진수 4660)을 빼주고 있다.

 

 

int len=0;
len = read(fd, buf, 32);

read()는 read(파일 디스크립터, 파일을 읽어들일 버퍼, 버퍼의 크기) 형식으로 구성된, 파일 내용을 읽을 수 있는 함수이다. 
위 명령을 보면 32byte의 크기만큼 fd의 내용을 buf에 읽어들이라는 것을 확인할 수 있다. 

 

 

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

 

strcmp는 두 개의 문자열을 비교한 뒤, 같으면 0, 다르면 1,-1을 반환하는 함수이다. 위 if문을 확인해보면 "LETMEWIN\n"과 buf가 같으면 strcmp 함수가 0을 반환하고, 단항연산자 '! (논리부정)'가 0(false)을 1(true)로 바꾸어주면서 if문이 실행된다.

if문이 실행되면 "good job :)\n" 문구가 뜨고, "/bin/cat flag" 명령어가 실행된다.

 

 

결과 화면

인자값으로 4660과 LETMEWIN을 넣어주면 flag 파일의 내용을 볼 수 있다.

 

 

성공!

그러면 성공!!

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

반응형

댓글