첫번째 문제는 fd (file descriptor)에 대한 문제이다.
문제를 누르면 위와 같이 뜨는데, 가능하면 혼자 풀어보고 싶었지만 지금 수준으로는 어떻게 해야하는 건지 감이 하나도 잡히지 않아서 위의 이미지에 있는 영상을 조금 참고했다.
File Descriptor는 시스템으로부터 할당받은 파일이나 소켓을 대표하는 정수값이다.
특정 파일에 접근할 때 사용하는 일종의 인덱스 값이라고 생각하면 될 듯 싶다..
integer value | name | <stdio.h> file stream |
0 | 표준 입력 | stdin |
1 | 표준 출력 | stdout |
2 | 표준 에러 출력 | stderr |
이 내용들이 어떻게 사용될 지는 잘 모르겠지만 일단 내용이 그렇다고 하니 정리해두고 넘어가도록 하자..
일단 맨 밑에 있는 명령어를 통해 접속을 해준다.
그러면 위와 같은 말이 뜨는데 비밀번호는 guest라고 했으므로 여기에 guest를 입력해준다.
접속이 완료되면 위와 같은 화면이 뜨게 된다.
ls를 이용하면 파일이 무엇이 있는지 확인이 가능한데, 단순히 ls 명령만으로는 파일에 대한 자세한 정보를 얻기 힘들기 때문에 l 옵션을 사용해서 아까 존재를 확인한 파일들의 자세한 정보를 출력해보았다.
우리가 필요로 하는 건 flag의 내용이라 이를 확인해보려고 했지만 허가가 거부되었다고 뜬다.
그러면 다른 방법을 찾아야하는데 마침 fd.c 파일의 내용을 확인해볼 수 있어서 이를 확인해보았다.
위의 코드를 해석하면
atoi는 문자열을 정수 타입으로 바꾸는 함수이다.
argv[1]을 정수로 바꾼 후 0x1234를 뺀 값이 fd에 저장된다는 걸 알 수 있다.
나머지는 buf에 저장된 내용이 "LETMEWIN\n"이면 flag를 출력한다는 것 정도를 얻을 수 있다.
여기까지는 했는데 이 다음부터는 어떻게 해야할지 감이 안 잡혀서 다시 영상과 이 문제를 푼 다른 사람들의 풀이를 참고해서 다음으로 진행했다.
찾아보니까 ./가 파일 실행 명령어였다. $ ./실행파일 이런 식으로 하면 그 파일을 실행시킨다고 한다.
이렇게 해서 대충 코드에 있는 아무 수나 넣어봤는데 Linux file IO에 대해 공부하라는 말이 뜬다.
그래서 처음에 정리했던 file descriptor의 input/ output에 대한 내용을 같이 고려해보기로 했다.
다시 코드로 돌아와서 read 함수에 주목했는데 fd를 인자로 받는 걸 볼 수 있다. (실제로 라이브러리를 참고해보면 확인 가능하다.)
위에서 설명한 대로 fd가 0이면 표준 입력을 수행할 것이고, 1이면 표준 출력을 수행할 것이다. 우리가 필요한 건 표준 입력으로 받은 데이터가 필요하므로 fd가 0이어야 한다.
그런데 아까 위에서 해석한 내용을 보면 argv[1]을 정수로 바꾸고 0x1234를 뺀 값이 fd라고 했다. 이 fd가 0이 되어야 표준입력으로 입력 받은 내용을 buf로 옮겨서 비교를 할 수 있기 때문에 0x1234를 10진수로 바꿔주면
4660이다. 따라서 ./fd 4660을 입력하면 아래처럼 입력을 기다리는 상태임을 확인할 수 있다.
여기에 LETMEWIN을 입력해주면
우리가 이전에 허가가 없어서 볼 수 없었던 flag의 내용을 볼 수 있다.
위에서 구한 내용을 복사해서 빈칸에 넣으면
이렇게 문제를 해결했다고 뜬다.
'Security > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] Toddler's Bottle - blackjack (0) | 2021.12.05 |
---|---|
[pwnable.kr] Toddler's Bottle - lotto (0) | 2021.11.28 |
[pwnable.kr] Toddler's Bottle - mistake (0) | 2021.11.21 |
[pwnable.kr] Toddler's Bottle - random (0) | 2021.11.15 |
[pwnable.kr] Toddler's Bottle - collision (0) | 2021.10.10 |
댓글