Network & Server Factory

개인 공부 기록

Algorithm

[pwnable.kr] fd 풀이

1nfra 2020. 1. 9. 00:48
인자로 받은 숫자에서 0x1234를 뺀 값을 파일 디스크립터로 쓰는 코드입니다. 4660(0x1234)을 넘기면 fd가 0(표준 입력)이 되어, 직접 LETMEWIN을 입력해 flag를 얻을 수 있습니다.

1. 문제 접속

pwnable.kr의 Toddler's Bottle에서 fd를 누르면 문제 설명과 접속 정보가 나옵니다.

pwnable.kr의 fd 문제

ssh fd@pwnable.kr -p2222

SSH로 문제 서버 접속

 

비밀번호는 guest입니다.

비밀번호 입력 후 접속 완료

2. 파일 확인

ls -al로 어떤 파일이 있는지 확인합니다.

ls -al 결과

 

fd.c 소스가 있으므로 cat으로 내용을 봅니다.

fd.c 소스 코드

3. 코드 분석

핵심은 다음 부분입니다.

int fd = atoi( argv[1] ) - 0x1234;
int len = 0;
len = read(fd, buf, 32);
if(!strcmp("LETMEWIN\n", buf)){
    printf("good job :)\n");
    system("/bin/cat flag");
    exit(0);
}
항목 내용
argv[1] 프로그램 인자로 넘긴 숫자
fd argv[1] - 0x1234
read(fd, buf, 32) fd에서 최대 32바이트를 buf로 읽음
성공 조건 buf가 "LETMEWIN\n"과 같을 것

 

파일 디스크립터 0은 표준 입력(stdin)입니다. 따라서 fd가 0이 되도록 0x1234, 즉 10진수 4660을 넘기면 read가 키보드 입력을 읽습니다.

4. 풀이

./fd 4660
LETMEWIN

4660으로 실행하면 입력을 기다립니다. LETMEWIN을 입력하고 엔터를 누르면 buf가 "LETMEWIN\n"이 되어 조건을 만족합니다.

4660으로 실행 후 입력 대기

 

good job :) 메시지와 함께 flag가 출력됩니다. 이 값을 문제 페이지에 제출합니다.

LETMEWIN 입력 후 출력된 flag

flag 제출 결과

5. 정리

  • fd = atoi(argv[1]) - 0x1234이므로 4660을 넘기면 fd가 0(stdin)이 됩니다.
  • stdin으로 LETMEWIN을 입력하면 strcmp 조건을 만족해 flag가 출력됩니다.
  • 리눅스 파일 디스크립터 0, 1, 2는 각각 stdin, stdout, stderr입니다.
728x90
서울
--:--:--
-전체 글
-카테고리
오늘 방문