_dl_fini exploit (_rtld_global)

2019. 10. 9. 23:50



참고 원문 : https://st4nw.github.io/2019-09-02/dlfini/




main -> libc_start_main -> exit -> run_exit_handlers

main의 리턴은 libc_start_main으로 향하고, libc_start_main은 exit을 호출하는데, 이 exit에서 __run_exit_handlers를 호출하여 소멸자를 호출하는 루틴에서 라이브러리의 특정 주소를 덮어쓸 수 있다면 _dl_fini 루틴에서 원하는 흐름으로 넘어갈 수 있는 익스 방법

void
exit (int status)
{
__run_exit_handlers (status, &__exit_funcs, true, true);
}
libc_hidden_def (exit)

_dl_fini

__run_exit_handler가 호출하는 _dl_fini가 실질적인 소멸자 호출을 담당하게된다. 서버환경과 사용하는 라이브러리에 따라 _dl_fini의 루틴도 다르기때문에 문제풀이 및 익스시에는 환경에 맞춰 분석을 해야한다.

   0x7ffff7de7dc9 <_dl_fini+777>:   mov    r12,QWORD PTR [rax+0x8]
  0x7ffff7de7dcd <_dl_fini+781>: mov   rax,QWORD PTR [rbx+0x120]
  0x7ffff7de7dd4 <_dl_fini+788>: add   r12,QWORD PTR [rbx]
  0x7ffff7de7dd7 <_dl_fini+791>: mov   rdx,QWORD PTR [rax+0x8]
  0x7ffff7de7ddb <_dl_fini+795>: shr   rdx,0x3
  0x7ffff7de7ddf <_dl_fini+799>: test   edx,edx
  0x7ffff7de7de1 <_dl_fini+801>: lea   r13d,[rdx-0x1]
  0x7ffff7de7de5 <_dl_fini+805>: je     0x7ffff7de7e00 <_dl_fini+832>
  0x7ffff7de7de7 <_dl_fini+807>: nop   WORD PTR [rax+rax*1+0x0]
  0x7ffff7de7df0 <_dl_fini+816>: mov   edx,r13d
  0x7ffff7de7df3 <_dl_fini+819>: call   QWORD PTR [r12+rdx*8]

위에서처럼 call을 통해 흐름을 바꿀 수 있는 부분이 있기때문에 위 부분이 가리키는 곳이 항상 같은지 동적으로 체크하여 해당 부분을 덮어서 exploit을 실행할 수 있다.


위 경우외에도 _dl_fini 루틴중 다음과 같은 부분이 있다면 _rtld_global+3840을 덮고, exit가 실행되면 원하는 흐름으로 바꿀 수 있다.

0x7ffff7de5a02 <_dl_fini+98>:    
  lea   rdi,[rip+0x217f5f]       # 0x7ffff7ffd968 <_rtld_global+2312>
  0x7ffff7de5a09 <_dl_fini+105>:    
  call   QWORD PTR [rip+0x218551]       # 0x7ffff7ffdf60 <_rtld_global+3840>

  0x7ffff7de5a0f <_dl_fini+111>:   mov   edx,DWORD PTR [rbx+0x8]
  0x7ffff7de5a12 <_dl_fini+114>:   test   edx,edx
  0x7ffff7de5a14 <_dl_fini+116>:   je     0x7ffff7de59e0 <_dl_fini+64>
  0x7ffff7de5a16 <_dl_fini+118>:   mov   rax,QWORD PTR [rbx]
  0x7ffff7de5a19 <_dl_fini+121>:   movzx r13d,BYTE PTR [rax+0x315]

동적으로 한줄씩 실행시키면서 분석하는 것이 제일 나은 방법인 것 같다.... 아니면 해당 부분에 breakpoint를 걸거나 해서 분석


+ Recent posts