먼저 주어진 명령어로 서버에 접속합니다:
ssh fd@pwnable.kr -p2222
이 명령어는 SSH(Secure Shell)를 사용해 pwnable.kr 서버의'fd' 사용자 계정으로 2222번 포트를 통해 접속하는 것입니다.
서버에 접속한 후, 현재 디렉토리의 파일들을 확인합니다:
ls -al

주목할 만한 파일로 'fd.c'가 보입니다. 이 파일의 내용을 살펴보겠습니다:
nano fd.c

코드에서 atoi 함수가 사용되고 있습니다. 이 함수는 "ASCII to Integer"의 약자로, 문자열을 정수로 변환하는 역할을 합니다.
" 123abc" → 123 반환
"-456 " → -456 반환
"789원" → 789 반환
"abc123" → 0 반환 (변환 실패)
" +42" → 42 반환
atof(): 문자열을 부동 소수점으로 변환atol(), atoll(): 문자열을 long 또는 long long 정수로 변환strtod(), strtof(), strtold(): 문자열을 double, float, long double로 변환strtod32(), strtod64(), strtod128(): 문자열을 10진수 부동 소수점으로 변환strtol(), strtoll(): 문자열을 long 및 long long 정수로 변환이후 분석은 이 atoi 함수의 동작을 고려하며 진행해야 할 것 같습니다.
tip) man 명령어를 이용하면 사용법과 다양한 옵션에 대한 설명이 표시됩니다.
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);
}
fd는 file descriptor함수입니다. 중요해요 read 함수는 fd로부터 32바이트를 읽어 buf에 저장합니다.buf의 내용이 "LETMEWIN\n"과 일치하면 플래그를 출력합니다.핵심 취약점은 fd 변수의 값을 조작할 수 있다는 점입니다.
fd가 0이 되면 read 함수는 표준 입력(키보드)에서 데이터를 읽게 됩니다.
fd가 0이 되도록 인자를 설정합니다: 0x1234 = 4660./fd 4660
LETMEWIN
실행 결과:

flag: mommy! I think I know what a file descriptor is!!
atoi 함수read 함수의 사용법과 입력 소스 제어