본문 바로가기

[Wargame Write-up]/Pwnable.kr

[Pwnable.kr] [Toddler's Bottle] fd



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