꿈이 너무 많은 한 대학생의 공간

Pwnable.kr - fd 문제풀이 본문

정보보안 공부/Pwnable.kr

Pwnable.kr - fd 문제풀이

청울울청 2020. 6. 2. 16:54

오늘은 다시 워게임 풀이로 돌아왔습니다.

 

이번 포스팅에서는 pwnable.kr 사이트의 문제를 풀어보도록 하겠습니다.

pwnable.kr은 시스템 해킹을 공부할때 가장 기초적인 사이트로 리눅스에 대한 개념과 시스템 해킹을 공부하고자 제가 선택했습니다.

 

그 중 제일 먼저 보이는 fd 문제를 풀어보록 하겠습니다.

 

 

 

어머니! 리눅스에서 File Descriptor 가 뭔가요?

 

- 워게임은 혼자 스스로 풀어야 하지만, 정말로 오리지널 초보자라면 다음 링크를 클릭하세요 (링크)

 

ssh fd@pwnable.kr -p2222

 

일단 ssh를 통해 문제풀이 서버에 접속해봅시다.

 

 

(접속 패스워드는 guest 입니다. 중간에 fingerprint 뭐시기가 나오면 yes 누르시면 되요.)

접속에 성공했으니 일단 환경부터 분석해보죠.

 

 

ls 명령어를 통해 현재 디렉토리를 살펴봅니다. fd 실행파일과 소스코드, 그리고 flag 파일이 있네요.

어림도 없겠지만 flag를 일단 실행해볼까요?

 

 

딱히 기대도 안했지만 권한이 거부되었다고 뜹니다.

그럼 fd 실행파일을 실행해 봅시다.

 

 

아무것도 입력을 안하니 실행 인자에 숫자를 넘기라네요. 아무거나 입력하니 리눅스 파일 Input Output(IO)를 더 공부하고 오랍니다. 그럼 소스코드를 살펴보겠습니다.

 

 

전체적인 소스코드를 살펴보면 먼저 32바이트 char 배열을 선언합니다. 그 후, 실행인자가 없다면 파일을 중단시키는 조건문,

첫 번째 실행 인자를 int화시켜서 16진수로 1234를 빼서 int형 변수 fd에 저장하고, buf에는 read 함수에 따라 값을 저장한 뒤 성공했는지 실패했는지에 대한 값을 len에 저장하고 buf 문자열이 LETMEWIN\n 인지 확인하고 flag 파일을 읽는 조건문, 그리고 프로그램 마무리입니다.

여기서 제일 먼저 알아야 할 것은 read함수입니다.

read함수는 3개의 인자를 받으며, 첫 번째 인자에서는 파일 디스크럽터, 두 번째 인자에서는 파일을 읽거나 쓸 버퍼, 세 번째 인자에서는 버퍼의 크기를 인자로 받습니다.

파일 디스크럽터란 쉽게 말하자면 컴퓨터 장치에 접근할 수 있는 종류이며, 기본적으로 시스템에는 0번, 1번, 2번이 내장되어 있습니다. 0번은 키보드로부터 입력을 받아오고, 1번은 모니터에 정상적으로 출력하고, 2번은 에러가 났을때 출력하는 역할입니다.

이때 우리는 buf 버퍼에 LETMEWIN을 입력해야 조건문이 통과되어 flag 파일을 읽을 수 있게 됩니다.
그럼 fd는 0이 되어야 키보드로 입력할 수 있어 buf에 LETMEWIN을 전달할 수 있겠네요.

이때 fd는 첫 번째 실행 인자를 정수화해 16진수 1234만큼 빼므로 16진수 1234를 입력해야 fd 값이 0이 됩니다.

16진수 1234는 10진수로는 4660 입니다.

 

 

그러므로 첫 번째 실행인자에 4660 을 전달해야 fd 값이 0 이 되고 read함수를 통해 입력이 가능하게 됩니다. 그러면 buf 함수에 저희가 원하는 값을 쓸 수 있겠네요.

 

 

입력하시면 플래그가 나옵니다. 시스템 해킹을 공부하실 때에는, 스스로 해보면서 학습하세요. 누군가가 올린 강좌를 보며 따라하는 것 보다는 막히는 부분의 해결책만 보고 스스로 파고드는 방법이 효과적입니다. 읽어주셔서 감사합니다!

더보기

flag : mommy! I think I know what a file descriptor is!!

'정보보안 공부 > Pwnable.kr' 카테고리의 다른 글

Pwnable.kr - bof 문제풀이  (0) 2020.06.09
Pwnable.kr - collision 문제풀이  (0) 2020.06.06
Comments