_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를 걸거나 해서 분석
'Pwnable!!' 카테고리의 다른 글
[PIE & Full RELRO] PIE Leak 하기 (0) | 2019.10.10 |
---|---|
[Leak Technology] Leak by stdout (0) | 2019.10.10 |
[ 19.04 ] glibc 2.29 heap exploit 관련 (0) | 2019.07.22 |
[Linux] gdb로 PIE 디버깅 (0) | 2019.07.22 |
[glibc] malloc - fastbin size check 분석 : malloc(): memory corruption (fast) (0) | 2019.07.13 |