Pwnable. Fd 문제 풀이. 1번.
Pwnable.kr 1번 문제다.
엄마! linux에서 파일 디스크립터가 무엇인가요? 라는 문제다.
일단 파일 디스크립터에 대한 설명이 필요하다.
아래 부분에서 설명을 하겠다.
원격 = xshell으로 접속한 결과 메타스플로잇 같이 그림이 나온다.
ls -al로 파일의 권한을 확인해 보겠다. 일단 fd와 flag가 보인다.
fd에는 setuid 권한이 설정되어 있고, 답이 적혀 있는 것 같은 flag 파일에는 fd2 권한이 되어야
볼 수 있다.
일단 BOF인줄 알았는데, BOF에 취약한 함수가 안 보이는 것 같아서 아닌 거 같다.
소스를 대강 보자면, fd의 인자 값(atoi(argv[1])으로 받아서 0x1234(10진수로 변환 => 4660)을
빼준다. 그리고 read 함수가 보이는데, read(a,b,c)를 설명하자면, a에는 파일 디스크립터 값,
b에는 읽은 데이터를 저장할 버퍼, c에는 얼만큼 읽을지를 전달해주는 함수다.
일단 fd를 읽어서 b에 데이터를 저장한다. 즉 fd에 있는 값을 buf에 넣어서 "LETMEWIN" 값과
비교해서 맞으면 PASS인 과정이다. If(!strcmp(a,b))에서 왜 "!"를 붙여 주었냐면, strcmp는 둘의
값이 일치하면 0을 반환한다. 하지만 if는 0을 거짓으로 보기 때문에 '!'를 붙여준 것이다.
밑의 표에서도 보이듯이 fd는 0,1,2로 반환을 한다. 0은 stdin, 1은 stdout, 2는 stderr를 반환하는데, 답을 찾기 위해서는 buf가 LETMEWIN이 되어야 한다고 했는데, 그러기 위해서는 입력을 받아야 한다. 입력을 받기 위해서는 fd값을 0으로 만들어줘야 하기 때문에 atoi(argv[1]) 부분을 0x1234로 입력해주면 된다. 0x1234를 입력해줄 수 없으니 10진수로 변환한 4660으로 변환하여 인자값으로 주면 fd는 0이 되어 표준 입력을 받는다.fd에 대해 추가 설명을 하자면, fd=file descriptor(파일 디스크립터)는 시스템으로부터 할당 받은 파일을 대표하는 0이 아닌 정수 값이고, 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스라고 할 수 있다. fd는 음수가 아닌 0과 양수인 정수 값 = unsigned int...
FD |
Purpose |
POSIX 이름 |
STDIO 스트림 |
0 |
표준 입력 |
STDIN_FILENO |
stdin |
1 |
표준 출력 |
STDOUT_FILENO |
stdout |
2 |
표준 에러 |
STDERR_FILENO |
stderr |
fd를 실행하고 4660를 입력하면, 입력 값이 나오는데 LETMEWIN를 입력한다.
fd@ubuntu:~$ ./fd 4660 LETMEWIN good job :) mommy! I think I know what a file descriptor is!!
cf) 어렵다..........해도해도 끝이 없는 거 같다.
'# Related site issues > PW.KR' 카테고리의 다른 글
Pwnable.flag. (0) | 2018.04.06 |
---|---|
Pwnable.bof. (0) | 2018.04.05 |
Pwnable.collision. (0) | 2018.04.05 |
Pwnable.UAF. (0) | 2018.04.05 |
Pwnable.Passcode. (0) | 2018.03.28 |