본문 바로가기

Wargame/[pwnable.kr]

[pwnable.kr] fd 문제 풀이

※ pwnable.kr의 워게임 fd 문제이다.

1. 일단 문제를 풀기 위해 서버에 접속하였다.

 

2. 리눅스 명령어 ls로 확인해본 결과 fd 실행파일, fd.c 파일, flag 파일이 존재하는것을 알 수 있다.

 

3. fd.c 파일을 열어보면 다음과 같다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char buf[32];
int main(int argc, char* argv[], char* envp[]){
	if(argc<2){
		printf("pass argv[1] a number\n");
		return 0;
	}
	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);
	}
	printf("learn about Linux file IO\n");
	return 0;
}

 

4. 이제부터 fd.c 파일을 분석할 것이다.

1) read 함수의 첫번째 인자는 0(표준입력:stdin)이여야 한다. 그러므로 fd = 0이고 argv[1]=0x1234=4660 이다.

if(argc<2){
	printf("pass argv[1] a number\n");
	return 0;
}
int fd = atoi( argv[1] ) - 0x1234;
int len = 0;
len = read(fd, buf, 32);
  • int argc : 메인 함수에 전달되는 정보의 갯수이다.
  • char* argv[] : 메임함수에 전달되는 실질적인 정보이다. argv[0]은 프로그램의 실행경로로 항상 고정되어 있다.

 

2) strcmp 함수를 사용하여 read 함수로 받아와 buf에 저장한 문자열을 비교한다. 만약 buf에 "LETMEWIN"이 저장되어 있으면 0을 반환한다. if문의 조건에 !strcmp로 부정이기 때문에 0(False)을 1(True)로 바꿔서 if문이 실행된다. 

if(!strcmp("LETMEWIN\n", buf)){
	printf("good job :)\n");
	system("/bin/cat flag");
	exit(0);
}
  • strcmp(str1,str2): 매개변수로 들어온 두개의 문자열을 비교한다.
    1) str1 < str2 경우 음수 반환
    2) str1 == str2 경우 0 반환
    3) str1 > str2 경우 양수 반환

 

3) if문은 system을 사용하여 flag파일을 읽는다. 

 

5. exploit

1)  fd 실행 파일을 실행하면서 argv[1]에 4660을 입력한다.

 

2) buf에 "LETMEWIN"을 입력하면 !strcmp가 True가 되면서 if문을 실행한다.

 

3) system이 flag 파일을 출력해 주면 정답 flag를 얻을 수 있다.(흰색줄은 flag 이다.)

 

 

'Wargame > [pwnable.kr]' 카테고리의 다른 글

[pwnable.kr] passcode 문제 풀이  (1) 2023.07.29
[pwnable.kr] random 문제 풀이  (0) 2023.07.29
[pwnable.kr] flag 문제 풀이  (0) 2022.08.20
[pwnable.kr] bof 문제 풀이  (0) 2022.08.20
[pwnable.kr] collision 문제 풀이  (0) 2022.08.19