
파일 디스크립터에 대한 문제 같다.
파일 디스크럽터는 리눅스 계열에서 프로세스가 파일을 다룰 때 사용하는 개념으로, 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값이다. 프로세스가 실행 중에 파일을 Open하면 커널은 해당 프로세스의 파일 디스크럽터 숫자 중 사용하지 않는 가장 작은 값을 할당해준다. 프로그램이 메모리에서 실행될 때, 기본적으로 할당되는 파일 디스크럽터는 표준입력, 표준 출력, 표준 에러이며 이들에게 각각 0, 1, 2라는 정수가 할당된다.

문제의 설명에 따라 powershell에서 ssh 접근

ls 결과 fd, fd.c, flag가 있고 flag는 fd 권한으로는 권한을 변경하거나 읽을 수가 없다

fd를 실행시키니 인자 값을 주라고 하는데
0을 줘보니 Linux file IO에 대해서 더 배우고 오라고 함

fd는 fd.c를 컴파일해서 만든 것 같다.
fd.c를 읽어보면 fd의 코드를 볼 수 있다.

주요 코드 부분은 아래인 것 같다.
atoi 는 문자열을 정수타입으로 바꾸고
0x1234는 10진수로 바꾸면 4660이다 (정수 상수를 적을 때 0x를 붙이면 16진법 표현)
fd에 파일을 읽으려는 적절한 값을 저장하려면 atoi(4661)-4660 처럼 값을 넣어야 1이 저장될 것이다
read() 시스템 콜은 해당 함수가 호출될 때마다 파일 디스크럽터가 참조하는 파일의 현재 file offset에서 len 바이트만큼 buf로 읽어들인다. read(fd, buf, 32)
int fd = atoi( argv[1] ) - 0x1234;
int len = 0;
len = read(fd, buf, 32);
if(!strcmp("LETMEWIN\n", buf)){
printf("good job :)\n");
4660 ~ 4662까지 넣고 LETMEWIN을 입력하니 flag를 획득할 수 있었다


'워게임,CTF > pwnable.kr' 카테고리의 다른 글
| pwnable.kr - collision (toddler's bottle) (0) | 2025.10.16 |
|---|