Pwnable.kr의 첫 번째 문제이다. fd라는 바이너리가 있는데, 숫자로 된 인자 하나를 필요로 한다.
소스 코드를 뜯어보자.
fd 변수에 입력한 숫자 - 0x1234한 값을 넣고, 그 fd로부터 32바이트만큼 읽어 buf에 저장한다.
buf의 값이 "LETMEWIN"이면 flag 파일을 읽고 종료, 아니면 오류를 뱉는다.
여기서 read라는 system call에 대해 알아보자.
read(int fd, void *buf, size_t nbytes)
fd: File Descriptor
buf: 읽고 저장할 버퍼
nbytes: 읽어들일 크기
리눅스에서는 파일, 소켓 등 입출력 처리를 할 때 File Descriptor를 이용한다.
기본적으로 아래의 3개를 지원해주며, 그 밖의 파일, 소켓을 이용한 입출력이 필요한 경우 3 이상의 값을 할당해 이용한다.
Value | Name |
0 | 표준 입력 (stdin) ex) 키보드 |
1 | 표준 출력 (stdout) ex) 모니터 |
2 | 표준 에러 (stderr) |
다시 코드로 돌아와서, 우리가 저 "LETMEWIN"이라는 문자열을 입력시키기 위해서는 fd 값을 표준 입력인 0으로 만들어야 한다.
즉, 0x1234의 십진수 값인 4660을 인자로 주면 될 것이다.
인자를 입력한 후, 키보드로부터의 입력을 대기하고 있는 표준 입력 상태가 된다.
C 언어의 scanf, gets 계열 함수를 썼을 때와 동일한 상태라고 보면 된다.
(정확히 말하면, C 언어의 입력 함수를 호출하면 내부적으로 system call인 read 함수를 호출한다.)
LETMEWIN을 입력해주면, flag 파일의 내용을 출력해주고 끝이 난다.
인증키는 가장 하단의 문장이다.
'[Wargame Write-up] > Pwnable.kr' 카테고리의 다른 글
[Pwnable.kr] [Toddler's Bottle] collision (0) | 2016.12.09 |
---|