ret地址 | stack | all

直接修改栈上的ret地址,leak栈地址方法参见这里

malloc系hook | libc | <2.34

修改 __malloc_hook/__free_hook/__realloc_hook... 为想要跳到的地址

__libc_atexit | libc | < 2.31

修改 __libc_atexit__start___libc_atexit__stop___libc_atexit 间存放了相关的hook函数地址,这两个符号无法用 libc.symbols[] 找到,可以gdb+调试符号找

_rtld_global.__rtld_lock_unlock_recursive | libc & ld | <2.34

修改 _rtld_global.__rtld_lock_unlock_recursive

gdb里找 _rtld_global._dl_rtld_unlock_recursive

https://blog.csdn.net/qq_43116977/article/details/105485947

__printf_function_table | libc | all

house of husk,需要调用了printf系函数且使用了任意格式化字符串(%?,?可以是任意ascii字符)

能够将__printf_function_table__printf_arginfo_table都修改为任意合法可读地址,并将__printf_function_table[spec]__printf_arginfo_table[spec] 设置为想要跳到的地址

(spec为使用的格串,例如 %s 则为 's' 的ascii码,也就是115,实际offset还需要*指针大小)

通常通过两次largebin attack完成

例子:Printf but not fmtstr

.fini_array | elf_base | all

在正常退出时,.fini_array里面的函数指针会被ld反向依次调用