pwnable.kr fd 시작!
flag 파일은 권한이 없어 읽지 못한다. fd.c 파일을 보자.
fd 값으로 argv[1] 에서 0x1234 를 뺀 값을 주고 있다. 그리고 read() 함수를 통해 buf 의 내용을 읽어오고 있다. 문제를 풀기 전에 먼저 read() 함수와 file descriptor 에 대해 알아보자.
read() 함수
ssize_t read(int fd, void *buf size_t nbytes)
인자
- int fd : open() 등을 통해 정상적으로 open 한 file descriptor
- void *buf : 파일을 읽어 들일 버퍼
- size_t nbytes : 버퍼의 크기
반환값
- 정상적인 실행 : 읽어 들인 바이트 수 반환
- 읽을 데이터가 없을 때 : 0 반환
- 실패 : -1 반환
file descriptor(파일 디스크립터)란?
- 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값
- 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스
- 기본적으로 동작하는 파일 디스크립터(표준 입력 - 0, 표준 출력 - 1, 표준 에러 - 2)
다시 fd.c 파일을 보면 13 번째 줄의 if 문에서 LETMEWIN 과 buf 의 값을 비교하여 같으면 flag 를 출력해준다. 때문에 buf 에 LETMEWIN 이라는 내용이 들어가야 한다. 위의 파일 디스크립터의 설명에 나왔듯이, fd 값이 0 일 때 표준 입력이기 때문에 atoi( argv[1] ) - 0x1234 값이 0 이어야 buf 에 내용을 입력할 수 있다. 0x1234 는 10진수로 4660 이기 때문에 argv[1] 로 4660 을 입력해주면 된다.
파일을 실행하면 입력 모드가 되어 LETMEWIN 을 입력해주면 위와 같이 flag 값을 얻을 수 있다. 인증하러 가자.
성공!
'WarGame > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] bof (0) | 2020.05.05 |
---|---|
[pwnable.kr] collision (0) | 2020.05.05 |