System Hacking/인터루드 스터디

[pwnable.kr] fd

daaaay 2026. 3. 26. 18:24

이 표 잘 알아두기 

파일 디스크립터 stdio 스트림(C 표준) POSIX 이름(유닉스/리눅스 표준) 목적
0 STDIN STDIN_FILENO 표준 입력
1 STDOUT STDOUT_FILENO 표준 출력
2 STDERR STDERR_FILENO 표준 오류

 

 

pwnable.kr로 가서 fd 문제 클릭

 

문제 누르면 아래처럼 뜬다

 

 

 

WSL 실행시키기

 

 

아까 팝업창에 뜬 아래 문장 붙여넣기

ssh fd@pwnable.kr -p2222

 

그러면 비밀번호 입력창이 나온다. 

 

아까 팝업에 써있던 guest입력하기 

 

 

문제에 접속됐다

 

 

ls해서 파일 목록보기

 
cat fd.c로 소스코드 파일 내용 보기

 

cat fd.c 분석해보자

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32]; //문자열 buf 크기 = 32바이트
int main(int argc, char* argv[], char* envp[]){
        if(argc<2){
		//프로그램 실행할 때, 파일명 옆에 숫자인 인자 1개 
                printf("pass argv[1] a number\n");
                return 0;
        }
        int fd = atoi( argv[1] ) - 0x1234;
		//atoi(문자열): char -> int 형변환 함수
		//문자는 0으로 변환. 문자열 내 숫자만 int로 형변환 
		//우리가 프로그램에 넣은 숫자(argv[1])에서 0x1234를 뺀 값을 fd 번호로 사용
		//0x1234는 10진수로 4660이다. 
        
		int len = 0;
        len = read(fd, buf, 32); //위에서 계산된 fd 번호로부터 32바이트를 읽어온다. 
        if(!strcmp("LETMEWIN\n", buf)){
        //buf의 내용이 "LETMEWIN\n" 이라면, 권한 상승 및 flag 파일 내용 출력한다 
                printf("good job :)\n");
                setregid(getegid(), getegid());
                system("/bin/cat flag");
                exit(0);
        }
        printf("learn about Linux file IO\n");
        return 0;

}

→ buf 값이 “LETMEWIN\n” 이어야 flag를 얻을 수 있음 + fd값은 인자값에 따라 바뀜

→ fd값 = 0 으로 만들면 키보드 입력(STDIN)한 데이터를 buf에 저장 가능

 

 

이렇게 치면 다음줄에 커서만 깜빡거린다. 

 

 

여기에 LETMEWIN 작성하고 엔터 치기 

 

플래그 획득 성공

Mama! Now_I_understand_what_file_descriptors_are!

 

플래그 넣어보기

 

 

성공했다

 

 

 

 

 

'System Hacking > 인터루드 스터디' 카테고리의 다른 글

[picoCTF] buffer overflow 2  (0) 2026.04.02
[picoCTF] buffer overflow 1  (0) 2026.04.02
[picoCTF:] buffer overflow 0  (0) 2026.04.02
[pwnable.kr] bof  (0) 2026.03.26
[워게임] 드림핵 : Welcome  (0) 2026.03.19