在gdb中调试canary的两种方法:
(1)在GDB
中输入
print (void)arch_prctl(0x1003,$rsp-8) |
__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的存放地址:
则在GDB
中arch_prctl(0x1003,$rsp-8)
的含义就是将fs
寄存器中的值拿出来放到$rsp-8
这个栈空间中
在GDB
中输入
print (void)arch_prctl(0x1003,$rsp-8) |
__pthread_enable_asynccancel