pwnable.kr에 들어가면 pwnable.kr의 첫 계단인 fd문제를 마주하게 된다.
문제의 이미지를 클릭하면 아이의 천진난만(?)한 질문과 함께 문제를 풀기 위해서 어떤 방식으로 접속하는지, 어떻게 푸는지 힌트를 제공해준다.
putty라는 프로그램으로도 문제 서버에 접속할 수도 있지만 나는 linux환경인 kali나 ubuntu의 터미널에 접속했다.
접속한 뒤 ls -l로 어떤 파일이 있는가 확인해 보니 setuid가 걸려있는 파일이 있었다. ( root권한에서 실행권한이 x대신 s가 되었기 때문 )
# setuid가 걸려있기 때문에 저 파일을 이용해서 권한을 얻어 flag를 실행시킬 수 있을 것이다.
그렇기 때문에 fd.c파일을 cat을 이용해서 읽어보면 fd의 소스코드를 알 수 있다. 그런 뒤 이 코드를 해석하면 될 것이다.
그렇게 코드를 해석하자면 우선 32크기의 buf라는 배열을 선언한뒤
입력인자를 2개이하로 설정하는 필터가 있고, 2번째 입력인자를 정수로 바꾼 값에서 0x1234를 빼준 값을 fd에 저장한다.
그리고 fd형식의 32개의 값을 buf에 저장한다. 그리고 buf와 LETMEWIN이라는 문자열과 비교해서 같으면 flag를 실행해준다.
코드의 소스를 해석했으니 이제 공격을 해보자.
해석한 코드를 거꾸로 생각하면 buf에 LETMEWIN이라는 문자열을 넣어주어야 하고 넣어주기 위해서는 입력을 해야하는데 여기서는 입력을 받는 함수가 없기 때문에 이 문제의 주제인 File Descriptor의 개념을 이용해야 한다.
File Descriptor는 0은 표준 입력 1은 표준출력등을 의미한다.
그렇기 때문에 read하는 부분에서 입력을 받아야 하기 때문에 fd에는 0을 넣어주어야 하는데, 2번째 입력인자를 0x1234와 같은 값을 입력해주어야하는데 2번째 입력인자의 문자열을 정수로 바꾸어서 계산을 해줘서 바로 0x1234를 넣어주면 풀리지 않는다 0x1234를 정수로 한번 변환해주어야 하기 때문에 문제서버 안에 들어있는 python을 이용했다.
이렇게 나온 값을 입력인자로 주면 입력이 가능하게 된다.
그렇게 ./fd 4660을 입력한뒤에 LETMEWIN을 입력해주면 flag가 실행된다.
flag : mommy! I think I know what a file descriptor is!!
'Hacking > Pwnable' 카테고리의 다른 글
[ pwnable.kr ] random 문제 풀이 (0) | 2019.09.04 |
---|---|
[ pwnable.kr ] passcode 문제풀이 (0) | 2019.08.30 |
[ pwnable.kr ] flag 문제풀이 (0) | 2019.08.30 |
[ pwnable.kr ] bof 문제풀이 (2) | 2019.08.28 |
[ pwnable.kr ] collision 문제 풀이 (0) | 2019.08.27 |