Profile

Choih0401 Story

Choih0401

[Toddler's Bottle] (1) fd 풀이

Pwnable.kr [Toddler's Bottle] 문제 풀이를 하겠습니다.

첫번째 문제는 fd 입니다.

문제를 확인해 보니 리눅스에서 파일 디스크립터에 관한 문제라는 것이 나오네요.



Putty를 통해 fd@pwnable.kr로 접속해봅시다.



ls -l 명령을 통해 디렉토리를 보니 다음과 같은 파일들이 검색되는 것을 확인 할 수 있었습니다.

setuid가 걸린 fd 파일, fd 파일의 소스인 fd.c 파일

그리고 root로 설정 되어있는 flag파일이 있는 것을 확인할 수 있습니다.



그럼 이제 fd.c 파일의 소스를 확인해 봅시다.



소스를 보면 atoi에 0x1234라는 ASCII 값을 빼줍니다.

그리고 len이라는 정수형 변수를 선언하고 len에 read()해서 값을 넣어줍니다.

*read 함수를 read(a,b,c)로 설명하자면 a에는 파일 디스크립터 값을, b에는 읽은 데이터를 저장할 버퍼를, c에는 얼만큼 읽을지 전달하는 버퍼이다.

fd를 읽어서 -> buf에 데이터 저장 -> strcmp로 LETMEWIN과 버퍼를 비교합니다.


파일 디스크립터(File Descriptor) : 시스템이 할당하여 준 파일이나 소켓을 대표하는 정수

이 정수를 사용하여 파일에 접근하거나 제어할 수 있다.(Windows에서의 Handle와 같음)

파일 디스크립터는 표준 입력일 때 0, 표준 출력일 때 1, 표준 에러 출력일 때 2를 반환한다.


if문이 실행되어야 flag를 뿌려줍니다.

if는 1이 되어야 실행인데 strcmp는 두개가 같으면 0을 반환합니다.

buf의 값이 LETMEWIN\n이 되어야 값을 따올 수 있습니다.


위에 read()에서 첫번째 인자, 파일 디스크립터가 0이 되면 표준 입력이라 하였습니다.

즉 fd값을 0으로 만들어 주고, 우리가 직접 LETMEWIN을 입력해주면 if문이 작동하게 됩니다.


fd를 0으로 만든다는 것은 그 위에 0x1234를 빼주기 때문에 인자값으로 0x1234를 주면 됩니다.



ASCII 값으로 답을 주니 Learn about Linux file IO 라는 값을 print 해줬습니다.

파일디스크립터 에는 16진수가 아닌 10진수가 들어가야 합니다.

0x1234를 10진수로 바꿔주면 4660이 나오게 됩니다.



그럼 4660을 넣고, LETMEWIN 엔터!



성공했다.


1포인트 얻었다.

'Hacking > Wargame' 카테고리의 다른 글

Webhacking.kr 5번 문제(300점)  (0) 2018.04.15
Webhacking.kr 4번 문제(150점)  (0) 2018.04.15
Webhacking.kr 1번 문제(200점)  (0) 2018.04.15
Webhacking.kr 회원가입 하기  (0) 2018.04.15
[Toddler's Bottle] (2) collision 풀이  (0) 2018.04.15