본문 바로가기

Pwnable/pwnable.kr

[pwnable.kr] fd 풀이

https://pwnable.kr/play.php

 

https://pwnable.kr/play.php

 

pwnable.kr


fd 문제를 선택하면 아래와 같은 화면이 나온다.

 

리눅스를 켜서 ssh fd@pwnable.kr -p2222를 입력해본다.

칼리 리눅스를 이용하여 문제를 풀었고, 일반 권한으로는 안 열려서 sudo를 사용하였다.

 

 

첫 번째 사진에서 나와있는 대로 password에 guest를 입력하면 아래의 그림과 같이 접속이 잘 된다.

 

접속한 후 ls -l 명령어를 통해 파일 상세정보를 확인해본다.

 

Fd, fd.c, flag라는 파일이 존재하고, 아마도 flag 파일을 확인해야 답을 알 수 있을 것 같다.

 

위의 그림과 같이 fd를 열려고 하니 숫자를 입력하라고 뜬다.

아직까지는 flag에서도 얻을 수 있는 정보가 없다

 

flag 파일의 코드인 것 같은 fd.c 파일을 열어서 내부를 확인해보면 아래의 그림과 같다.

이때 위에서 fd를 열기 위해 입력해야 하는 숫자를 input이라고 하겠다.

 

Fd.c 파일의 내용을 확인해보면 아래와 같은 소스코드를 볼 수 있다.

 

위의 소스코드를 하나씩 해석해보면 (전문적이지 않고, 내가 이해하기 편한 대로 표현하였다.)

1.    input을 buf에 저장한다.

2.    argc<2이면 “pass argv [1] a number\n”이라는 메시지를 출력한다.

3.    argv[1]를 정수 타입으로 변환한 값에서 0x1234 만큼 뺀 값을 fd에 저장한다.

        : fd = input – 0x1234(4660)

4.    fd파일 내부의 32byte를 가져와 buf에 저장한다.

5.    buf에 저장된 문자열이 “LETMEWIN\n”이면 “good job”을 출력한다.


 여기서 파일 디스트립터 개념을 알아야 하는데, 간단하게 말해서 파일 디스크립터는 시스템으로부터 할당받을 파일을 대표하는 정수 값이다. 모르는 개념이라서 검색을 통해 아래의 링크에서 알게 되었다.

https://junshock5.tistory.com/116

 

파일 디스크립터란?

파일 디스크립터란? 시스템으로부터 할당받은 파일을 대표하는 0이아닌 정수값 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스 흔히 유닉스 시스템에서 모든것을 파일

junshock5.tistory.com


 

다시 문제로 돌아가, 

Flag를 얻기 위해서는 위의 소스코드 5번에서와 같이 buf가 LETMEWIN 이어야 한다.

그러기 위해서는 파일 디스크립터 값을 표준 입력, 즉 0으로 만들어서 LETMEWIN을 입력해야 한다.

즉, 위의 3번 공식을 이용하면 0 = input – 0x1234 가 되어야 하고, 결과적으로 input은 0x1234(4660)이 되어야 한다.

 

따라서 flag를 얻기 위해서는 아래의 그림과 같이./fd 4660을 하여 LETMEWIN을 입력하면

flag를 얻을 수 있다!

'Pwnable > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] lotto 풀이  (0) 2021.08.18
[pwnable.kr] mistake 풀이  (0) 2021.07.29
[pwnable.kr] leg 풀이  (0) 2021.07.29
[pwnable.kr] random 풀이  (0) 2021.07.29
[pwnable.kr] collision 풀이  (0) 2021.07.26