언제나 항상 그래왔듯
ls -alF
로 파일목록을 확인합니다.
(flag는 현재 권한이 없어 접근이 불가합니다.)
접근 가능한 파일 중 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; // 매개변수를 정수형으로 바꾸고 16진수로 1234 즉, 10진수로 4660만큼을 뺌
int len = 0;
len = read(fd, buf, 32); // 버퍼에 값 입력
if(!strcmp("LETMEWIN\n", buf)){ // 값이 LETMEWIN일 경우 flag 출력
printf("good job :)\n");
system("/bin/cat flag");
exit(0);
}
printf("learn about Linux file IO\n"); // 파일 디스크립트(fd)의 값이 0~2가 아니면 출력
return 0;
}
코드를 확인하면 파일디스크립터로 입력받은 값에서 4660만큼 뺀 수를 저장한다는 것을 알 수 있습니다. 그리고 파일디스크립터의 값이 유효한 값이면 솔직히 상관 없지만, 그래도 용도에 맞춰주기 위해 파일 디스크립터가 0이 되도록 매개변수로 4660을 넘겨줍니다.
매개변수로 4660을 넘겨주면 learn about Linux file IO\n
이 출력되지 않고 입력상태가 됩니다. 이때 LETMEWIN
을 입력하면 플래그 값이 정상적으로 출력되고 프로그램이 끝납니다.