Security/System
[pwnable.kr] Toddler's Bottle - fd 문제
bonggang
2019. 9. 9. 14:48
문제
문제 풀이
접속
- 리눅스에서 파일 디스크립터가 무엇인지 묻는 질문이기에 먼저 ssh로 원격 접속
ssh fd@pwnable.kr -p 2222
// ssh 접속 방법: ssh [접속계정] -p [포트번호]
코드 확인 및 해석
- ls 명령어를 사용해서 파일 목록을 확인
- cat 명령어를 사용해서 코드 확인
#include <stdio.h>
#include <stdlib.h>
#incldue <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; //argv[1]을 숫자로 변경 후 - 0x1234
int len =0;
len = read(fd, buf, 32);
if(!strcmp("LETMEWIN\n", buf)){ //buf 값과 LETMEWIN\n을 비교
printf("good job : )\n");
system("/bin/cat flag");
exit(0);
}
printf("learn about Linux file IO\n");
return 0;
}
-> if(argc<2) : 파라미터 값을 줘야한다.
-> 0x1234의 10진수 값은 4660
-> read(int fd, void *buf, size_t nbytes): 파일 디스크립터, 버퍼, 버퍼 크기 파라미터 필요
-> read의 파일 디스크립터, 이 문제에서는 표준 입력을 이용해 LETMEWIN\n을 넣어주어야하기 때문에 파일 디스크립터가 0이 되어야 함. => argv[1] = 0x1234
파일 디스크립터 | 이름 | 정의 |
0 | stdin | 명령어 표준 입력 |
1 | stdout | 명령어 표준 출력 |
2 | stderr | 명령어 표준 오류 |
실행 화면