1. 풀이
- hint 파일의 내용을 확인하면, /usr/bin/level5를 실행하면 /tmp/level5.tmp 임시파일을 생성함
- 심볼링 링크를 이용한 레이스 컨디션과 관련된 문제임을 유추가능
심볼릭 링크(Symbolic Link)
- 특정 파일이나 디렉터리에 대해 참조하는 파일로, 윈도우의 바로가기와 비슷한 개념
- 원본파일과 다른 inode를 가짐
- 심볼릭 링크 수정 시 원본 파일도 함께 수정
- 원본 삭제시 심볼릭 링크는 더 이상 사용할 수 없음
- 명령 : ln -s [원본] [심볼링 링크]
레이스 컨디션(Race Condition)
- 두 개의 프로세스/쓰레드가 하나의 자원을 접근하려고 할 때 경쟁하는 상태
- 실행 프로세스가 임시파일을 생성할 경우, 실행 중에 끼어들어 임시 파일을 목적 파일로 연결(심볼릭 링크)하여, 권한 상승(setuid를 이용) 등 악용하는 공격
- 단, 소유자가 root이고 SetUID가 설정된 프로그램이 생성하는 임시 파일 이름 및 경로를 알고 있어야함
- /usr/bin/level5를 반복 실행 및 /tmp/level5.tmp를 파일 A의 심볼릭 링크로 지정하여 공격을 시도
- 공격자가 생성산 임시파일 A가 자원 선점 경쟁에서 선점하게 될 경우 다음과 같은 시나리오가 발생
① /usr/bin/level5 실행
② 공격자의 심볼릭 링크 시도 ln -s A level5.tmp 및 자원 선점 발생
③ 임시파일 A 오픈
④ 임시파일 A 쓰기
⑤ 심볼릭 링크에 의한 원본 /tmp/level5.tmp에 쓰기 발생
⑥ 해당 프로그램(파일) 실행 종료
- /usr/bin/level5를 반복 실행하는 및 임시파일 Race Condition 코드 작성 후 컴파일, 실행
- 이후, tmp 디렉터리를 확인해보면 level6pass.txt 파일이 생성되었으며, 해당 파일을 통해 비밀번호를 알 수 있음
2. GDB를 통한 의사 코드 복원
- creat>print>remove 순으로 호출되며, cmpl을 통해 두 값을 비교하여 이후 실행 순서를 결정
- create(file, 권한)으로 파일을 생성한 후 값 비교를 통해 이후 실행 순서를 결정하며, printf로 출력하는 구문을 보았을때, 임시파일 /tmp/level5.tmp가 이미 존재하는 파일일 경우 해당 파일을 삭제하고 실행을 종료하는 것을 추측가능함.
- write>close>remove 순으로 호출
- wirte() 함수로 파일에 작성되는 문자열을 보았을 때, 임시파일인 /tmp/level5.tmp가 존재하지 않을 경우 비밀번호를 기록하고, 파일을 삭제하는 것으로 추측가능함.
#include <stdio.h>
int main()
{
// 변수 선언
char *pass="next password : ";
char *path="/tmp/level5.tmp";
// 임시파일 생성
// 파일 생성 성공 시 파일 디스크립터 반환(0,1,2)
// 파일 생성 실패 시 -1 반환
fd=creat(path,0x180);
if(fd<0) // 파일 생성 실패 시 (/tmp/level5.tmp가 이미 존재하는 경우)
{
printf("Can not creat a temporary file.\n"); // 구문 출력
remove(path); // 이미 존재하고 있는 /tmp/level5.tmp 삭제
exit(0); // 함수를 종료시킨다
}
else // 파일 생성 성공
{
write(fd,pass,0x1f) // 임시 파일 /tmp/level5.tmp에 pass 내용 쓰기
close(fd); // 파일 닫기
remove(path); // 파일 삭제
}
return 0;
}
'문제풀이 > FTZ' 카테고리의 다른 글
FTZ Level7 풀이 (0) | 2022.10.28 |
---|---|
FTZ Level6 풀이 (1) | 2022.10.28 |
FTZ Level4 풀이 (0) | 2022.10.27 |
FTZ Level3 풀이 (0) | 2022.10.25 |
FTZ Level2 풀이 (0) | 2022.10.25 |