2018. 5. 2. 22:28ㆍ0x04 pwnable
ch12 : Race condition 문제
바이너리는 /tmp/tmp_file.txt를 생성하는데 (v4) 이미 존재하면 exit(0)
바이너리는 /challenge/app-systeme/ch12/.passwd를 연다. (v5)
해당 경로에 이 파일이 존재하지 않으면 exit(0)
while ( read(v5, &buf, 1u) == 1 )
write(v4, &buf, 1u);
플래그를 1바이트씩 읽은 후 v4에 차곡차곡 저장한다.
unlink("/tmp/tmp_file.txt");
시간 조금 지나고 /tmp/tmp_file.txt를 지워버려서 플래그를 획득할 수 없다.
그렇다면, 어떻게 익스플로잇을 할 것인가?
눈여겨 보아야 하는 단어는 "지워버리는 unlink" 이다.
/tmp/tmp_file.txt를 생성한 직후 fakefile과 /tmp/tmp_file.txt를 링킹
[익스플로잇]
1단계. 타깃 무한 실행 가능한 바이너리 생성
2단계. symbolic linking 진행 가능한 바이너리 생성
2개의 바이너리를 생성하는 이유
[*] 실제 바이너리 ch12는 write를 통해 /tmp/tmp_file.txt에 넣게 된다.
하지만, 몇 초 뒤에 삭제를 시켜버린다.
이 몇초는 해당 바이너리에서 자원을 사용하는데 걸리는 시간이기도 하다.
동시에 여러개의 프로그램이 똑같은 자원 /tmp/tmp_file.txt를 사용하려고 하면
경쟁상태에 들어가게 된다.
즉, 2번째 파일에서 fake file을 만들어두고 fake file의 심볼릭링크를
/tmp/tmp_file.txt로 하게 되면, 이 /tmp/tmp_file.txt는 첫번째 프로그램에서
만들어지는 /tmp/tmp_file.txt와 다른 녀석이 되게 된다.
2번째 바이너리가 경쟁에서 이기게 되면, 첫번째 바이너리는
/tmp/tmp_file.txt가 없는 상태 이므로 /tmp/tmp_file.txt를 만들고
.passwd파일을 /tmp/tmp_file.txt에 복사하였을 때
unlink되지 않고, /tmp/tmp_file.txt를 읽을 수 있게 된다.
'0x04 pwnable' 카테고리의 다른 글
Priority Inversion & Priority Inheritance (0) | 2018.05.04 |
---|---|
리눅스 커널 공부 1 (0) | 2018.05.04 |
Rootme Race condition (ch12) (0) | 2018.05.02 |
고수준 파일 입출력 공부 (0) | 2018.04.29 |
저수준 파일 입출력 공부 (0) | 2018.04.29 |