Rootme ch12 (Race condition)

2018. 5. 2. 22:280x04 pwnable

728x90

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