exit_hook
pwn题堆利用的一些姿势 – free_hook
pwn题堆利用的一些姿势 – malloc_hook
pwn题堆利用的一些姿势 – IO_FILE
pwn题堆利用的一些姿势 – setcontext
概述
在做堆题的时候,经常会遇到保护全开的情况,其中对利用者影响最大的是 PIE 保护和 Full RELRO ,NX 保护和栈保护对堆利用来说影响都不大,一般利用也不会往这方面靠。开了 PIE 保护的话代码段的地址会变,需要泄露代码段基地址才能利用存储在 bss 段上的堆指针;开了 Full RELRO 的话,则意味着我们无法修改 got 表,导致无法修改其它函数 got 表指向 system ,进一步获取到 shell 。因此也就有了我这一系列文章的目的,在 got 表无法被修改时,我们往往利用的就是下面的一些 hook + onegadget 来达到我们的目的。
主要分为以下几个系列:malloc_hook --> free_hook --> IO_FILE --> setcontext --> exit_hook。
exit_hook 介绍
首先我们来认识一下 exit_hook ,编写如下测试代码,然后再用对应的 libc 去编译。
#include <stdio.h>
int main() {
printf("hello\n");
}
编译命令如下,使用对应的 ld 和 libc 进行编译。这里注意一定要使用相应的 libc 和动态链接器进行编译调试,否则即使使用 patchelf 或者 python 修改加载的动态链接器和 libc 也无法获得正确的偏移。
$ gcc test.c -o test -Wl,--rpath=/usr/local/libc/ -Wl,--dynamic-linker=/usr/local/libc/ld-2.23.so
这里我们使用的是 libc-2.23.so 版本,然后在 gdb 中进行调试。通过调试我们可以发现,所有程序即使没有明确调用 exit 函数,最后在__libc_start_main
中也会主动调用 exit 函数,而 exit_hook 就是指的 exit 函数执行过程中的两个子函数调用。
在 exit 执行过程中,会调用两个函数,一个是__rtld_lock_lock_recursive
,另一个是__rtld_lock_unlock_recursive
,这两个函数在 libc-2.23.so 中的偏移如下截图所示。首先_rtld_g