思路 pthread多线程利用 栈溢出覆盖TLS结构体中内容,来绕过canary保护 栈迁移到bss段去执行onegadget 主函数: 漏洞函数:可以栈溢出 基本知识 / sysdeps\x86_64\nptl\tls.h typedef struct { void *tcb; /* Pointer to the TCB. Not necessarily the thread descriptor used by libpthread. */ dtv_t *dtv; void *self; /* Pointer to the thread descriptor. */ int multiple_threads; int...

wp源地址 总结 通过本题的学习与总结有: 之前一直以为ret2libc必须得返回到原本的输入函数处,再次输入一次getshell。但有时候我们重新返回到原本的输入函数可能会出现一些问题,因此我们可以打一个栈迁移+rop执行read。就是先覆盖rbp为bss段上的地址,然后执行puts函数泄露libc,接着执行read函数往bss段上输入数据,最后执行leave ret完成栈迁移从而将执行流劫持到bss段上 插入到栈里的canary是从TLS结构体中的stack_guard成员变量赋值过来的(而函数返回时,会将栈里的canary与TLS中的stack_guard做对比)。主线程中的TLS通常位于mmap映射出来的地址空间里,而位置也...

前置知识 canary防御措施与其绕过 ret2libc 栈迁移(可用) 整体思路 题目非常简单粗暴,主要逻辑是在一个子线程中实现的。首先输入要输入的长度,然后再输入payload,且长度可以非常大。因此,要进行栈溢出的唯一难点就在canary,而canary是位于fs寄存器 中的,也就是TLS结构体的一个偏移。在子线程中,tls结构体在栈中的偏移是固定的,可以在gdb中通过p/x *(tcbhead_t*)(pthread_self())方式来查看tls结构体的值。其中stack_guard就是canary的值,校验canary时会取出这个值和栈中的canary进行校验,==因此覆盖这个值为想要的值即可==。可以在gdb通过...