첫번째 포너블 문제는 위와 같다!
칼리 리눅스를 통해 ssh fd@pwnable.kr -p2222를 입력한 뒤, 비밀번호 guest도 입력하고 나면 접속이 된다.
ls -l을 통해 현재 디렉토리에 있는 파일들을 확인해봤다.
cat 명령어를 이용해 flag 파일을 보려 했지만, 예상대로 Permission denied가 떴다.
cat 명령어를 이용해 fd.c 파일의 내용도 확인해보았다. 이 코드를 잘 해석해서 fd 실행파일에 인자값을 제대로 넣어야 문제가 풀릴 것 같다.
if(argc<2){
printf("pass argv[1] a number\n");
return 0;
}
fd 파일에 주어진 인자값이 ./fd 명령을 포함해 2개 미만이라면 return 0으로 종료된다.
int fd=atoi(argv[1]) - 0x1234;
atoi("문자열")는 문자열을 숫자(정수 타입(으로 반환해주는 함수다. 즉 '문자 1'을 '숫자 1'로 바꿔주는 역할을 한다. 위 명령에서 인자값 argv[1]을 숫자로 바꾼 뒤, 0x1234 (10진수 4660)을 빼주고 있다.
int len=0;
len = read(fd, buf, 32);
read()는 read(파일 디스크립터, 파일을 읽어들일 버퍼, 버퍼의 크기) 형식으로 구성된, 파일 내용을 읽을 수 있는 함수이다.
위 명령을 보면 32byte의 크기만큼 fd의 내용을 buf에 읽어들이라는 것을 확인할 수 있다.
if(!strcmp("LETMEWIN\n", buf)){
printf("good job :)\n");
system("/bin/cat flag")
exit(0);
}
strcmp는 두 개의 문자열을 비교한 뒤, 같으면 0, 다르면 1,-1을 반환하는 함수이다. 위 if문을 확인해보면 "LETMEWIN\n"과 buf가 같으면 strcmp 함수가 0을 반환하고, 단항연산자 '! (논리부정)'가 0(false)을 1(true)로 바꾸어주면서 if문이 실행된다.
if문이 실행되면 "good job :)\n" 문구가 뜨고, "/bin/cat flag" 명령어가 실행된다.
인자값으로 4660과 LETMEWIN을 넣어주면 flag 파일의 내용을 볼 수 있다.
그러면 성공!!
flag: mommy! I think I know what a file descriptor is!!
'포너블(pwnable) > CTF(pwnable.kr)' 카테고리의 다른 글
[Toddler's Bottle] input 문제풀이 (0) | 2021.04.07 |
---|---|
[Toddler's Bottle] random 문제풀이 (0) | 2021.04.05 |
[Toddler's Bottle] flag 문제풀이와 UPX 설치 (0) | 2021.03.27 |
[Toddler's Bottle] bof 문제풀이 (0) | 2021.03.23 |
[Toddler's Bottle] collision 문제풀이 (0) | 2021.03.20 |
댓글