문제의 소스코드는 다음과 같다.
#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;
}
버퍼에 크기는 32Byte 이며 argc < 2 보다 작을때 다시 시도하게 한다.
입력받은 fd 값에 - 0x1234 를 빼야 한다.
C언어 atoi 함수는 Ascii to int 를 뜻하며 아스키 코드를 정수형 값으로 변환해 준다.
Read 함수에서 첫번째 인자 fd에 0이란 값이 들어가 표준입력으로 인식된다. ( 변수 len == 0;)
즉 키보드로 입력하는 buf 안에 값을 저장하게 된다.
이후 LETMEWIN\n 문자열과 Buf 를 비교하여 참이되어 1이 출력될 경우 flag를 획들 할 수 있는 구조다.
먼저 16진수 0x1234를 10진수 계산기로 계산하면 4660이 된다.
argc 1번째 값에 4660을 넣어 실행시킨다면 fd 값이 0이 될 것이다.

그렇게 플래그를 획득 할 수 있다.