본문 바로가기

Pwnable/pwnable.kr

pwnable.kr wargame fd write-up

pwnable.kr에 나와있는 접속 정보로 접속

시작하자마자 flag란 파일이 보이는데 열 수 없다.

 

ls -al로 확인해보자

Windows Terminal
닫기
-r--r----- 1 fd_pwn root 50 Jun 11 2014 flag

권한이 없다.

 

이제 문제 프로그램의 소스코드를 확인해보자.

c
닫기
#include <stdio.h> #include <stdlib.h> #include <string.h> char buf[32]; int main(int argc, char* argv[], char* envp[]){ ​​​​​​​​if(argc<2){ ​​​​​​​​​​​​​​​​printf("pass argv[1] a number\n"); ​​​​​​​​​​​​​​​​return 0; ​​​​​​​​} ​​​​​​​​int fd = atoi( argv[1] ) - 0x1234; ​​​​​​​​int len = 0; ​​​​​​​​len = read(fd, buf, 32); ​​​​​​​​if(!strcmp("LETMEWIN\n", buf)){ ​​​​​​​​​​​​​​​​printf("good job :)\n"); ​​​​​​​​​​​​​​​​system("/bin/cat flag"); ​​​​​​​​​​​​​​​​exit(0); ​​​​​​​​} ​​​​​​​​printf("learn about Linux file IO\n"); ​​​​​​​​return 0; }

 

buf의 값과 LETMEWIN 문자열을 비교한다.

buf에 값을 입력하기 위해서는 fd를 0으로 만들어야 한다.

이유를 알기 위해 리눅스의 파일 디스크립터와 read 함수를 알아보자.

 

리눅스 파일 디스크립터란?
리눅스와 유닉스에서는 시스템을 전부 파일로 처리하여 관리한다.

시스템에서 프로세스가 파일에 접근하기 위한 방법으로 파일 디스크립터(FIle Descriptor)라는 핸들이 필요하다.
번호 설명 이름 파일 스트림
0 표준 입력(Standard input) STDIN_FILENO stdin
1 표준 출력(Standard output) STDOUT_FILENO stdout
2 표준 에러(Standard error) STDERR_FILENO stderr

 

c
닫기
ssize_t read (int fd, void *buf, size_t nbytes)

 

우리는 buf에 원하는 값을 입력하기 위해서 fd를 0으로 만들어야 하는 것이다.

 

fd는 첫 번째 인자와 4660(DEC)을 뺀 값이므로 0을 만들기 위해서 4660을 넣어주자.

이제 입력을 할 수 있으니 LETMEWIN을 입력해주자.

 

플래그가 나왔다.

 

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

'Pwnable > pwnable.kr' 카테고리의 다른 글