自从西工大网络空间安全学院计算机系统基础实验二(清楚实验框架及phase_1)-CSDN博客这篇文章之后,我们获取了phase_1的答案字符串,如 图1:phase_1的答案字符串 所示,注意每个人的答案字符串可能都不一样。接着我们开始解phase_2。首先,在命令行窗口中使用命令"gdb ./bomb"将bomb这个可执行文件作为gdb处理的对象,如 图2:在命令行窗口中使用命令"gdb ./bomb"将bomb这个可执行文件作为gdb处理的对象 所示。下一步就是打断点,既然phase_1的字符串已经知道了,那么我们便选择在phase_2这个函数处打断点,命令是"b phase_2",如 图3:在phase_2这个函数处打断点,命令是"b phase_2" 所示。为了查看我们所打下的断点,使用"info b"命令,查看我们已经打下的断点,如 图4:为了查看我们所打下的断点,使用"info b"命令,查看我们已经打下的断点 所示。接着就应该运行bomb这个可执行文件了,使用命令"r"开始执行bomb这个可执行文件,如 图5:使用命令"r"开始执行bomb这个可执行文件 所示。接下来把我们从phase_1中得到的字符串输入复制粘贴到命令行中,如 图6:把我们从phase_1中得到的字符串输入复制粘贴到命令行中 所示。注意,这里一定要按顺序做题!!!这次实验跟第一次实验不一样,不是想先做那个就做那个,所以phase_1一定要认真做!!!
I turned the moon into something I call a Death Star.
(图1:phase_1的答案字符串)
(图2:在命令行窗口中使用命令"gdb ./bomb"将bomb这个可执行文件作为gdb处理的对象)
(图3:在phase_2这个函数处打断点,命令是"b phase_2")
(图4:为了查看我们所打下的断点,使用"info b"命令,查看我们已经打下的断点)
(图5:使用命令"r"开始执行bomb这个可执行文件)
(图6:把我们从phase_1中得到的字符串输入复制粘贴到命令行中)
接着,还是随便输入一个字符串,在这里我们输入仍然输入"111",然后回车,如 图7:因为断点打在了phase_2函数上,所以在通过phase_1之后,随便输入字符串"111"做试验 所示。接着,在正式开始单步执行汇编指令之前,我们先对phase_2函数的汇编代码有一个总览,如 图8:对phase_2函数的汇编代码有一个总览 所示。
(图7:因为断点打在了phase_2函数上,所以在通过phase_1之后,随便输入字符串"111"做试验)
(图8:对phase_2函数的汇编代码有一个总览)
这时,有了phase_1的经验,大家已经可以独立使用"ni"命令来单步执行汇编代码了。在这里,作者再带着大家一步一步执行吧。只不过,只有当函数的栈帧发生有意义的变化、寄存器的值发生有意义的变化、遇到类似于phase_1中的strings_not_equal函数这三种情况出现时,作者才会画出栈帧图和寄存器的值,或者讲解具体函数的原理。如果大家有哪些地方不懂的话,在评论区留言,我每天晚上10点25都会定期查看并回复哒!我们来看吧:
(图9:实际执行——执行第<phase_2>行汇编代码之前各寄存器与栈帧的情况。)
(图10:实际执行——执行第<phase_2>行汇编代码之后各寄存器与栈帧的情况。)
(图11:实际执行——执行第<phase_2+4>行汇编代码之后各寄存器与栈帧的情况。)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd11c | 0x5655657a | 函数phase_2的返回地址(不是phase_2的栈帧!!!) | |
0xffffd118 | 0xf7fb3000 | 旧的%edi的值 | %esp |
(图12:纸上分析——执行第<phase_2+4>行汇编代码之后各寄存器与栈帧的情况。)
(图13:实际执行——执行第<phase_2+5>行汇编代码之后各寄存器与栈帧的情况。)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd11c | 0x5655657a | 函数phase_2的返回地址(不是phase_2的栈帧!!!) | |
0xffffd118 | 0xf7fb3000 | 旧的%edi的值 | |
0xffffd114 | 0xffffd1f4 | 旧的%esi的值 | %esp |
(图14:纸上分析——执行第<phase_2+5>行汇编代码之后各寄存器与栈帧的情况。)
(图15:实际执行——执行第<phase_2+6>行汇编代码之后各寄存器与栈帧的情况。)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd11c | 0x5655657a | 函数phase_2的返回地址(不是phase_2的栈帧!!!) | |
0xffffd118 | 0xf7fb3000 | 旧的%edi的值 | |
0xffffd114 | 0xffffd1f4 | 旧的%esi的值 | |
0xffffd110 | 0x5655af64 | 旧的%ebx的值 | %esp |
(图16:纸上分析——执行第<phase_2+6>行汇编代码之后各寄存器与栈帧的情况。)
(图17:实际执行——执行第<phase_2+7>行汇编代码之后各寄存器与栈帧的情况。)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd11c | 0x5655657a | 函数phase_2的返回地址(不是phase_2的栈帧!!!) | |
0xffffd118 | 0xf7fb3000 | 旧的%edi的值 | |
0xffffd114 | 0xffffd1f4 | 旧的%esi的值 | |
0xffffd110 | 0x5655af64 | 旧的%ebx的值 | |
0xffffd10c | |||
0xffffd108 | |||
0xffffd104 | |||
0xffffd100 | |||
0xffffd0fc | |||
0xffffd0f8 | |||
0xffffd0f4 | |||
0xffffd0f0 | |||
0xffffd0ec | |||
0xffffd0e8 | %esp |
(图18:纸上分析——执行第<phase_2+7>行汇编代码之后各寄存器与栈帧的情况。)
(图19:实际执行——执行第<phase_2+10>行汇编代码之后各寄存器与栈帧的情况。)
(图20:实际执行——执行第<phase_2+15>行汇编代码之后各寄存器与栈帧的情况。)
(图21:实际执行——执行第<phase_2+21>行汇编代码之后各寄存器与栈帧的情况。)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd11c | 0x5655657a | 函数phase_2的返回地址(不是phase_2的栈帧!!!) | |
0xffffd118 | 0xf7fb3000 | 旧的%edi的值 | |
0xffffd114 | 0xffffd1f4 | 旧的%esi的值 | |
0xffffd110 | 0x5655af64 | 旧的%ebx的值 | |
0xffffd10c | |||
0xffffd108 | |||
0xffffd104 | |||
0xffffd100 | |||
0xffffd0fc | |||
0xffffd0f8 | |||
0xffffd0f4 | |||
0xffffd0f0 | |||
0xffffd0ec | |||
0xffffd0e8 | %esp |
寄存器名称 | 寄存器中的值 |
%eax | 0x277f1e00 |
(图22:纸上分析——执行第<phase_2+21>行汇编代码之后各寄存器与栈帧的情况。)
在执行完第<phase_2+21>行代码之后,作者中间退出了一下,而下一次重新启动gdb、装入bomb可执行文件、打下断点、运行可执行文件、输入正确的phase_1的答案字符串、随便输入phase_2字符串、一直"ni"的时候,%eax的值就发生了变化,这就是为什么两次%eax的值不一样的原因,大家不要弄混哦!
(图23:实际执行——执行第<phase_2+27>行汇编代码之后各寄存器与栈帧的情况。)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd11c | 0x5655657a | 函数phase_2的返回地址(不是phase_2的栈帧!!!) | |
0xffffd118 | 0xf7fb3000 | 旧的%edi的值 | |
0xffffd114 | 0xffffd1f4 | 旧的%esi的值 | |
0xffffd110 | 0x5655af64 | 旧的%ebx的值 | |
0xffffd10c | 0xe57d8b00 | 旧的%eax的值 | |
0xffffd108 | |||
0xffffd104 | |||
0xffffd100 | |||
0xffffd0fc | |||
0xffffd0f8 | |||
0xffffd0f4 | |||
0xffffd0f0 | |||
0xffffd0ec | |||
0xffffd0e8 | %esp |
寄存器名称 | 寄存器中的值 |
%eax | 0xe57d8b00 |
(图24:纸上分析——执行第<phase_2+27>行汇编代码之后各寄存器与栈帧的情况。)
(图25:实际执行——执行第<phase_2+31>行汇编代码之后各寄存器与栈帧的情况。)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd11c | 0x5655657a | 函数phase_2的返回地址(不是phase_2的栈帧!!!) | |
0xffffd118 | 0xf7fb3000 | 旧的%edi的值 | |
0xffffd114 | 0xffffd1f4 | 旧的%esi的值 | |
0xffffd110 | 0x5655af64 | 旧的%ebx的值 | |
0xffffd10c | 0xe57d8b00 | 旧的%eax的值 | |
0xffffd108 | |||
0xffffd104 | |||
0xffffd100 | |||
0xffffd0fc | |||
0xffffd0f8 | |||
0xffffd0f4 | |||
0xffffd0f0 | |||
0xffffd0ec | |||
0xffffd0e8 | %esp |
寄存器名称 | 寄存器中的值 |
%eax | 0x0 |
(图26:纸上分析——执行第<phase_2+31>行汇编代码之后各寄存器与栈帧的情况。)
(图27:实际执行——执行第<phase_2+33>行汇编代码之后各寄存器与栈帧的情况。)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd11c | 0x5655657a | 函数phase_2的返回地址(不是phase_2的栈帧!!!) | |
0xffffd118 | 0xf7fb3000 | 旧的%edi的值 | |
0xffffd114 | 0xffffd1f4 | 旧的%esi的值 | |
0xffffd110 | 0x5655af64 | 旧的%ebx的值 | |
0xffffd10c | 0xe57d8b00 | 旧的%eax的值 | |
0xffffd108 | |||
0xffffd104 | |||
0xffffd100 | |||
0xffffd0fc | |||
0xffffd0f8 | |||
0xffffd0f4 | %eax | ||
0xffffd0f0 | |||
0xffffd0ec | |||
0xffffd0e8 | %esp |
寄存器名称 | 寄存器中的值 |
%eax | 0xffffd0f4 |
(图28:纸上分析——执行第<phase_2+33>行汇编代码之后各寄存器与栈帧的情况。)
(图29:实际执行——执行第<phase_2+37>行汇编代码之后各寄存器与栈帧的情况。)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd11c | 0x5655657a | 函数phase_2的返回地址(不是phase_2的栈帧!!!) | |
0xffffd118 | 0xf7fb3000 | 旧的%edi的值 | |
0xffffd114 | 0xffffd1f4 | 旧的%esi的值 | |
0xffffd110 | 0x5655af64 | 旧的%ebx的值 | |
0xffffd10c | 0xe57d8b00 | 旧的%eax的值 | |
0xffffd108 | |||
0xffffd104 | |||
0xffffd100 | |||
0xffffd0fc | |||
0xffffd0f8 | |||
0xffffd0f4 | %eax | ||
0xffffd0f0 | |||
0xffffd0ec | |||
0xffffd0e8 | |||
0xffffd0e4 | 0xffffd0f4 | push %eax的结果 | %esp |
寄存器名称 | 寄存器中的值 |
%eax | 0xffffd0f4 |
(图30:纸上分析——执行第<phase_2+37>行汇编代码之后各寄存器与栈帧的情况。)
(图31:实际执行——执行第<phase_2+38>行汇编代码之后各寄存器与栈帧的情况。)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd120 | 0x5655b7b0 | 函数phase_2的第一个入口参数(不是phase_2的栈帧!!!) | |
0xffffd11c | 0x5655657a | 函数phase_2的返回地址(不是phase_2的栈帧!!!) | |
0xffffd118 | 0xf7fb3000 | 旧的%edi的值 | |
0xffffd114 | 0xffffd1f4 | 旧的%esi的值 | |
0xffffd110 | 0x5655af64 | 旧的%ebx的值 | |
0xffffd10c | 0xe57d8b00 | 旧的%eax的值 | |
0xffffd108 | |||
0xffffd104 | |||
0xffffd100 | |||
0xffffd0fc | |||
0xffffd0f8 | |||
0xffffd0f4 | %eax | ||
0xffffd0f0 | |||
0xffffd0ec | |||
0xffffd0e8 | |||
0xffffd0e4 | 0xffffd0f4 | push %eax的结果 | |
0xffffd0e0 | 0x5655b7b0 | %esp |
寄存器名称 | 寄存器中的值 |
%eax | 0xffffd0f4 |
(图32:纸上分析——执行第<phase_2+38>行汇编代码之后各寄存器与栈帧的情况。)
此时一定要停下来!!!不能再使用"ni"单步运行汇编代码,而是应该使用"step"进入函数内部,否则的话炸弹即会被引爆!!!作者就因为犯了这个错误,重新启动了一遍程序,并且使用"1 2 3 4 5 6"来尝试作为phase_2的答案字符串。当重新启动当同样的地方时,如 图33:实际验证——使用"step"命令执行第<phase_2+42>行汇编代码之后各寄存器与栈帧的情况 所示。
(图33:实际执行——使用"step"命令执行第<phase_2+42>行汇编代码之后各寄存器与栈帧的情况)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd0e8 | 函数phase_2的栈帧 | ||
0xffffd0e4 | 0xffffd0f4 | 函数phase_2的栈帧 | |
0xffffd0e0 | 0x5655b7b0 | 函数phase_2的栈帧 | |
0xffffd0dc | 0x565566ca | 函数read_six_numbers的返回地址 | %esp |
(图34:纸上分析——使用"step"命令执行第<phase_2+42>行汇编代码之后各寄存器与栈帧的情况)
(图35:实际执行——使用"ni"命令执行第<read_six_numbers>行汇编代码之后各寄存器与栈帧的情况)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd0e8 | 函数phase_2的栈帧 | ||
0xffffd0e4 | 0xffffd0f4 | 函数phase_2的栈帧 | |
0xffffd0e0 | 0x5655b7b0 | 函数phase_2的栈帧 | |
0xffffd0dc | 0x565566ca | 函数read_six_numbers的返回地址 | %esp |
(图36:纸上分析——使用"ni"命令执行第<read_six_numbers>行汇编代码之后各寄存器与栈帧的情况)
(图37:实际执行——使用"ni"命令执行第<read_six_numbers+4>行汇编代码之后各寄存器与栈帧的情况)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd0e8 | 函数phase_2的栈帧 | ||
0xffffd0e4 | 0xffffd0f4 | 函数phase_2的栈帧 | |
0xffffd0e0 | 0x5655b7b0 | 函数phase_2的栈帧 | |
0xffffd0dc | 0x565566ca | 函数read_six_numbers的返回地址,函数phase_2的栈帧 | |
0xffffd0d8 | 0x5655af64 | 旧%ebx的值 | %esp |
(图38:纸上分析——使用"ni"命令执行第<read_six_numbers+4>行汇编代码之后各寄存器与栈帧的情况)
(图39:实际执行——使用"ni"命令执行第<read_six_numbers+5>行汇编代码之后各寄存器与栈帧的情况)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd0e8 | 函数phase_2的栈帧 | ||
0xffffd0e4 | 0xffffd0f4 | 函数phase_2的栈帧 | |
0xffffd0e0 | 0x5655b7b0 | 函数phase_2的栈帧 | |
0xffffd0dc | 0x565566ca | 函数read_six_numbers的返回地址,函数phase_2的栈帧 | |
0xffffd0d8 | 0x5655af64 | 旧%ebx的值 | |
0xffffd0d4 | |||
0xffffd0d0 | %esp |
(图40:纸上分析——使用"ni"命令执行第<read_six_numbers+5>行汇编代码之后各寄存器与栈帧的情况)
(图41:实际执行——使用"ni"命令执行第<read_six_numbers+8>行汇编代码之后各寄存器与栈帧的情况)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd0e8 | 函数phase_2的栈帧 | ||
0xffffd0e4 | 0xffffd0f4 | 函数phase_2的栈帧 | |
0xffffd0e0 | 0x5655b7b0 | 函数phase_2的栈帧 | |
0xffffd0dc | 0x565566ca | 函数read_six_numbers的返回地址,函数phase_2的栈帧 | |
0xffffd0d8 | 0x5655af64 | 旧%ebx的值 | |
0xffffd0d4 | |||
0xffffd0d0 | %esp |
寄存器名称 | 寄存器中的值 |
%ebx | 0x56556ef4 |
(图42:纸上分析——使用"ni"命令执行第<read_six_numbers+8>行汇编代码之后各寄存器与栈帧的情况)
(图43:实际执行——使用"ni"命令执行第<read_six_numbers+13>行汇编代码之后各寄存器与栈帧的情况)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd0e8 | 函数phase_2的栈帧 | ||
0xffffd0e4 | 0xffffd0f4 | 函数phase_2的栈帧 | |
0xffffd0e0 | 0x5655b7b0 | 函数phase_2的栈帧 | |
0xffffd0dc | 0x565566ca | 函数read_six_numbers的返回地址,函数phase_2的栈帧 | |
0xffffd0d8 | 0x5655af64 | 旧%ebx的值 | |
0xffffd0d4 | |||
0xffffd0d0 | %esp |
寄存器名称 | 寄存器中的值 |
%eax | 0xffffd0f4 |
%ebx | 0x5655af64 |
(图44:纸上分析——使用"ni"命令执行第<read_six_numbers+13>行汇编代码之后各寄存器与栈帧的情况)
(图45:实际执行——使用"ni"命令执行第<read_six_numbers+19>行汇编代码之后各寄存器与栈帧的情况)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd0e8 | 函数phase_2的栈帧 | ||
0xffffd0e4 | 0xffffd0f4 | 函数phase_2的栈帧 | |
0xffffd0e0 | 0x5655b7b0 | 函数phase_2的栈帧 | |
0xffffd0dc | 0x565566ca | 函数read_six_numbers的返回地址,函数phase_2的栈帧 | |
0xffffd0d8 | 0x5655af64 | 旧%ebx的值 | |
0xffffd0d4 | |||
0xffffd0d0 | %esp |
寄存器名称 | 寄存器中的值 |
%eax | 0xffffd0f4 |
%ebx | 0x5655af64 |
%edx | 0x2 |
(图46:纸上分析——使用"ni"命令执行第<read_six_numbers+19>行汇编代码之后各寄存器与栈帧的情况)
(图47:实际运行——使用"ni"命令执行第<read_six_numbers+23>行汇编代码之后各寄存器与栈帧的情况)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd0e8 | 函数phase_2的栈帧 | ||
0xffffd0e4 | 0xffffd0f4 | 函数phase_2的栈帧 | |
0xffffd0e0 | 0x5655b7b0 | 函数phase_2的栈帧 | |
0xffffd0dc | 0x565566ca | 函数read_six_numbers的返回地址,函数phase_2的栈帧 | |
0xffffd0d8 | 0x5655af64 | 旧%ebx的值 | |
0xffffd0d4 | |||
0xffffd0d0 | %esp |
寄存器名称 | 寄存器中的值 |
%eax | 0xffffd0f4 |
%ebx | 0x5655af64 |
%edx | 0xffffd108 |
(图48:纸上分析——使用"ni"命令执行第<read_six_numbers+23>行汇编代码之后各寄存器与栈帧的情况)
(图49:实际运行——使用"ni"命令执行第<read_six_numbers+26>行汇编代码之后各寄存器与栈帧的情况)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd0e8 | 函数phase_2的栈帧 | ||
0xffffd0e4 | 0xffffd0f4 | 函数phase_2的栈帧 | |
0xffffd0e0 | 0x5655b7b0 | 函数phase_2的栈帧 | |
0xffffd0dc | 0x565566ca | 函数read_six_numbers的返回地址,函数phase_2的栈帧 | |
0xffffd0d8 | 0x5655af64 | 旧%ebx的值 | |
0xffffd0d4 | |||
0xffffd0d0 | |||
0xffffd0cc | 0xffffd108 | 第<read_six_numbers+26>行 push %edx | %esp |
寄存器名称 | 寄存器中的值 |
%eax | 0xffffd0f4 |
%ebx | 0x5655af64 |
%edx | 0xffffd108 |
(图50:纸上分析——使用"ni"命令执行第<read_six_numbers+26>行汇编代码之后各寄存器与栈帧的情况)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd0e8 | 函数phase_2的栈帧 | ||
0xffffd0e4 | 0xffffd0f4 | 函数phase_2的栈帧 | |
0xffffd0e0 | 0x5655b7b0 | 函数phase_2的栈帧 | |
0xffffd0dc | 0x565566ca | 函数read_six_numbers的返回地址,函数phase_2的栈帧 | |
0xffffd0d8 | 0x5655af64 | 旧%ebx的值 | |
0xffffd0d4 | |||
0xffffd0d0 | |||
0xffffd0cc | 0xffffd108 | 第<read_six_numbers+26>行 push %edx | %esp |
寄存器名称 | 寄存器中的值 |
%eax | 0xffffd0f4 |
%ebx | 0x5655af64 |
%edx | 0xffffd104 |
(图51:实际运行与纸上分析——使用"ni"命令执行第<read_six_numbers+27>行汇编代码之后各寄存器与栈帧的情况)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd0e8 | 函数phase_2的栈帧 | ||
0xffffd0e4 | 0xffffd0f4 | 函数phase_2的栈帧 | |
0xffffd0e0 | 0x5655b7b0 | 函数phase_2的栈帧 | |
0xffffd0dc | 0x565566ca | 函数read_six_numbers的返回地址,函数phase_2的栈帧 | |
0xffffd0d8 | 0x5655af64 | 旧%ebx的值 | |
0xffffd0d4 | |||
0xffffd0d0 | |||
0xffffd0cc | 0xffffd108 | 第<read_six_numbers+26>行 push %edx | |
0xffffd0c8 | 0xffffd104 | 第<read_six_numbers+30>行 push %edx | %esp |
寄存器名称 | 寄存器中的值 |
%eax | 0xffffd0f4 |
%ebx | 0x5655af64 |
%edx | 0xffffd104 |
(图52:实际运行与纸上分析——使用"ni"命令执行第<read_six_numbers+30>行汇编代码之后各寄存器与栈帧的情况)
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd0e8 | 函数phase_2的栈帧 | ||
0xffffd0e4 | 0xffffd0f4 | 函数phase_2的栈帧 | |
0xffffd0e0 | 0x5655b7b0 | 函数phase_2的栈帧 | |
0xffffd0dc | 0x565566ca | 函数read_six_numbers的返回地址,函数phase_2的栈帧 | |
0xffffd0d8 | 0x5655af64 | 旧%ebx的值 | |
0xffffd0d4 | |||
0xffffd0d0 | |||
0xffffd0cc | 0xffffd108 | 第<read_six_numbers+26>行 push %edx | |
0xffffd0c8 | 0xffffd104 | 第<read_six_numbers+30>行 push %edx | |
0xffffd0c4 | 0xffffd100 | 第<read_six_numbers+34>行 push %edx | |
0xffffd0c0 | 0xffffd0fc | 第<read_six_numbers+38>行 push %edx | |
0xffffd0bc | 0xffffd0f8 | 第<read_six_numbers+42>行 push %edx | %esp |
(图53:实际运行与纸上分析——使用"ni"命令执行第<read_six_numbers+42>行汇编代码之后各寄存器与栈帧的情况)
内存地址 | 内存地址中的数 | 注释 | 指向这块内存的寄存器 |
0xffffd0e8 | 函数phase_2的栈帧 | ||
0xffffd0e4 | 0xffffd0f4 | 函数phase_2的栈帧 | |
0xffffd0e0 | 0x5655b7b0 | 函数read_six_numbersd的第一个ru'kou函数phase_2的栈帧 | |
0xffffd0dc | 0x565566ca | 函数read_six_numbers的返回地址,函数phase_2的栈帧 | |
0xffffd0d8 | 0x5655af64 | 旧%ebx的值 | |
0xffffd0d4 | |||
0xffffd0d0 | |||
0xffffd0cc | 0xffffd108 | 第<read_six_numbers+26>行 push %edx | |
0xffffd0c8 | 0xffffd104 | 第<read_six_numbers+30>行 push %edx | |
0xffffd0c4 | 0xffffd100 | 第<read_six_numbers+34>行 push %edx | |
0xffffd0c0 | 0xffffd0fc | 第<read_six_numbers+38>行 push %edx | |
0xffffd0bc | 0xffffd0f8 | 第<read_six_numbers+42>行 push %edx | |
0xffffd0b8 | 0xffffd0f4 | 第<read_six_numbers+43>行 push %eax | %esp |
(图54:实际运行与纸上分析——使用"ni"命令执行第<read_six_numbers+43>行汇编代码之后各寄存器与栈帧的情况)