SECURITY/System | Wargame

[Pwnable.kr] fd

yuujoeng 2022. 10. 4. 12:35

이번주 부터는 pwnable.kr 문제를 풀어보려고 한다.

파이팅 :D !

ls -al 명령어로 디렉토리의 모든 파일에 대해 자세한 내용을 출력했다.

fd, fd.c, flag라는 파일이 눈에 들어오는데 권한을 살펴보자면

나는 fd의 권한을 가지고 있기 때문에 fd는 읽고 실행할 수 있고

fd.c는 읽을 수 있으며, flag는 아무것 도 할 수 없다.

read 권한이 있는 fd.c의 내용을 읽어 보았다.

먼저 인자의 개수가 2개 미만일 때 pass argv[1] a number을 출력하고 프로그램을 종료한다.

fd 파일을 실행할 때 인자값이 주어지지 않으면 문장과 함께 강제 종료되는 코드이다.

atoi 함수는 아스키 코드 값을 int 값으로 바꾸어 주는 함수이다.

argv는 아스키 코드의 값으로 들어오므로 이를 int로 변환하고 0x1234(4660)을 빼서 int형 fd에 대입한다.

다음으로 int형 len을 0으로 초기화 해준다.

read 함수를 사용하여 fd로 읽어온 값을 최대 32byte 만큼 buf에 저장한다.

다음으로 if 문 안의 조건을 확인하면 strcmp 함수는 동일하면 0을 반환하는 함수이지만

" ! "가 붙었기 때문에 다르면 0을 반환하고 비교 대상은 buf의 내용과 "LETMEWIN\n"이다.

이 두 내용을 비교해서 같을 경우에 "good job :)\n"과 flag의 내용을 출력한다.

즉, LETMEWIN와 buf 문자열이 같으면 flag 내용을 cat 할 수 있다.

* atoi

- 필요한 헤더 : stdlib.h

- 파라미터 : 문자열

- 변환값 : 숫자로 변환된 값 ("500" 문자열을 넣으면 정수 500이 리턴됨)

* read ( int filedescriptor, void *buf, size_t count);

- filedescriptor : 읽기 작업을 수행할 파일에 대한 파일 기술자

- buf : 파일로부터 읽어들인 내용을 저장하기 위한 공간. 배열을 사용하며 형식은 상관 없음

- count : 읽을 파일의 내용의 크기를 지정. 바이트 단위로 서술

- return : 읽기 작업이 성공할 경우 읽어 온 파일의 내용의 바이트 크기가 반환되며, 파일끝에 도달하면 0을 반환

- 파일디스크립터 종류 : 0(표준입력) 1 (표준출력) 2 (표준에러)

표준입력이 되어야 하므로 fd 값이 0이 되어야 한다.

fd의 인자값에서 0x1234(4660)을 빼서 0을 만드므로 인자는 10진수로 변환한 값인 "4660"으로 입력해야 한다.

이후 LETMEWIN을 입력하여 if문 안에 들어가도록 하고,

flag를 출력하도록 한다.

fd 의 flag는 "mommy! I think I know what a file descriptor is!!"