今天遇到一个pthread_getspecific这个glibc函数发生coredump的情况:
(gdb) info reg
rax 0x380 896
rbx 0xa5 165
rcx 0x30 48
rdx 0x380 896 8 这个rdx 值变成无效的数据
es 0x0 0
fs 0x0 0
gs 0x0 0
(gdb) disass
Dump of assembler code for function pthread_getspecific:
0x00007f172eb8d730 <+0>: endbr64
0x00007f172eb8d734 <+4>: cmp $0x1f,%edi
0x00007f172eb8d737 <+7>: ja 0x7f172eb8d780 <pthread_getspecific+80>
0x00007f172eb8d739 <+9>: mov %edi,%eax
0x00007f172eb8d73b <+11>: add $0x31,%rax
0x00007f172eb8d73f <+15>: shl $0x4,%rax
0x00007f172eb8d743 <+19>: mov %fs:0x10,%rdx 这个值就说从特殊的即存在获取数据,如果这个base的寄存器发生错误或者对应的栈内容发生错误,就会导致取出的数据不对
0x00007f172eb8d74c <+28>: add %rax,%rdx
=> 0x00007f172eb8d74f <+31>: mov 0x8(%rdx),%rax
0x00007f172eb8d753 <+35>: test %rax,%rax
原因是,应用程序里使用strncpy,最后一个length值特别大,导致直接将栈数据都破坏调然后影响到了
指令:mov %fs:0x10,%rdx