(gdb) disas caller
Dump of assembler code for function caller():
0x0000000000400857 :push %rbp
0x0000000000400858 :mov %rsp,%rbp
0x000000000040085b :mov $0x14,%edi
0x0000000000400860 :callq 0x400804
0x0000000000400865 :mov $0x4009fc,%esi
0x000000000040086a :mov $0x601060,%edi
0x000000000040086f :callq 0x4006f0 <_zstlsist11char_traitsiceerst13basic_ostreamict_es5_pkc>
0x0000000000400874 :mov $0x400710,%esi
0x0000000000400879 :mov %rax,%rdi
0x000000000040087c :callq 0x400700 <_znsolsepfrsos_e>
0x0000000000400881 :pop %rbp
0x0000000000400882 :retq
(gdb) disas main
Dump of assembler code for function main():
0x0000000000400883 : push %rbp
0x0000000000400884 : mov %rsp,%rbp
0x0000000000400887 : callq 0x400857
0x000000000040088c : mov $0x400a03,%esi
0x0000000000400891 : mov $0x601060,%edi
0x0000000000400896 : callq 0x4006f0 <_zstlsist11char_traitsiceerst13basic_ostreamict_es5_pkc>
0x000000000040089b : mov $0x400710,%esi
0x00000000004008a0 : mov %rax,%rdi
0x00000000004008a3 : callq 0x400700 <_znsolsepfrsos_e>
0x00000000004008a8 : mov $0x0,%eax
0x00000000004008ad : pop %rbp
0x00000000004008ae : retq
根据$rbp表明,当前实际应该是执行到了 main()函数的0x000000000040088c : mov $0x400a03,%esi的上一条指令(caller()函数)
的0x0000000000400865 :mov $0x4009fc,%esi的上一条0x0000000000400860 :callq 0x400804 中。
在coredump以后。
------------------------------------------------------
(gdb) info register
rax 0x7fffffffe518 140737488348440
rbx 0x0 0
rcx 0x7ffff77fd910 140737345739024
rdx 0x0 0
rsi 0x7ffff7ad1ab0 140737348704944
rdi 0x7ffff7ad0260 140737348698720
rbp 0x400000003 0x400000003
rsp 0x7fffffffe520 0x7fffffffe520
r8 0x7ffff7202740 140737339467584
r9 0x7ffff7202740 140737339467584
r10 0x7fffffffe280 140737488347776
r11 0x7ffff7785c90 140737345248400
r12 0x400720 4196128
r13 0x7fffffffe610 140737488348688
r14 0x0 0
r15 0x0 0
rip 0x4 0x4
eflags 0x216 [ PF AF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
------------------------------------------------------
根据core文件的寄存器信息,可知,bp及ip均已写飞。只能利用sp指针来查询。
------------------------------------------------------
(gdb) x/32ux $rsp
0x7fffffffe520: 0xffffe530 0x00007fff 0x0040088c 0x00000000
(gdb) x/i 0x0040088c
0x40088c : mov $0x400a03,%esi
(gdb) disas main
Dump of assembler code for function main():
0x0000000000400883 : push %rbp
0x0000000000400884 : mov %rsp,%rbp
0x0000000000400887 : callq 0x400857
0x000000000040088c : mov $0x400a03,%esi
------------------------------------------------------
由此,可以查出是core在了main函数中。
例子使用的最简单的,实际测试时,会有多层调用,但是原理不变。
限制:如果越界的长度超过了函数调用堆栈的长度,本方法则不再可用。
以后补个图。今天就到这里了