canary 相关知识点


在gdb中调试canary的两种方法:

(1)在GDB中输入

print (void)arch_prctl(0x1003,$rsp-8)
x/xg $rsp-8 即可查看到 fs 中的值
#注意这个调试命令的输入必须保证此时程序还在子线程中;

__pthread_enable_asynccancel

(2)

p (void *)pthread_self()

覆盖canary为自己设定值

(1)不仅仅是fs寄存器所指向空间的前0x28个字节的空间不能乱写;

(2)再向前推0x100的空间内也有一部分空间不可以乱写;(偏移0x88开始)

TLS

TLS的意思是线程私有局部变量;我们的canary、还有那个global_pointer_guard都是线程私有的局部变量,只不过是平时我们看到的是主线程所拥有的、看起来是全局变量一样,这个地址是由fs寄存器所保存,但是我们在用户态调试fs寄存器只能看到0;但是在创建子线程的时候,会复制一份给子线程,这样canary也就跟了进去,这个时候线程私有局部变量就存储在线程栈底部,在大规模的栈溢出下是可以覆盖的;

如何调试子线程canary的存放地址:

则在GDBarch_prctl(0x1003,$rsp-8)的含义就是将fs寄存器中的值拿出来放到$rsp-8这个栈空间中

GDB中输入

print (void)arch_prctl(0x1003,$rsp-8)
x/xg $rsp-8 即可查看到 fs 中的值
#注意这个调试命令的输入必须保证此时程序还在子线程中;

__pthread_enable_asynccancel


文章作者: q1ming
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 q1ming !
  目录