이 표 잘 알아두기
| 파일 디스크립터 | 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 |