Overwrite _rtld_global
·
Wargame/Dreamhack
1. intro 2. code 및 분석 2.1 code // Name: ow_rtld.c // Compile: gcc -o ow_rtld ow_rtld.c #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } int main() { long addr; long data; int idx; init(); printf("stdout: %p\n", stdout); while (1) { printf("> "); scanf("%d", &idx); switch (idx) { case 1: printf("addr: "); scanf("%ld", &addr); printf("data: "); scanf("%ld", &dat..
rtld_global
·
Tips & theory
이론 프로그램이 return 함수와 함께 종료되는 경우 main 함수는 __libc_start_main __GI_exit __run_exit_handlers _dl_fini 등의 함수를 차례로 거치며 종료되는데, 이 중 _dl_fini 코드 내의 _rtld_global 구조체에서 _dl_load_lock을 인자로 __dl_rtld_lock_recursive 함수를 호출하게 된다. # define __rtld_lock_lock_recursive(NAME) \ GL(dl_rtld_lock_recursive) (&(NAME).mutex) void _dl_fini (void) { #ifdef SHARED int do_audit = 0; again: #endif for (Lmid_t ns = GL(dl_nns) ..