GDB调试汇编栈堆过程的学习

时间:2023-03-09 03:26:16
GDB调试汇编栈堆过程的学习

前期调试

我的程序代码是:

GDB调试汇编栈堆过程的学习

  • 首先,用gcc g gdb.c -o gdb -m32产生32位汇编。

GDB调试汇编栈堆过程的学习

  • 输入gdb gdb进入gdb调试器
  • 在main函数处设置一个断点:b main

GDB调试汇编栈堆过程的学习

  • disassemble指令获取汇编代码

GDB调试汇编栈堆过程的学习

  • 输入i r查看个寄存器的值

GDB调试汇编栈堆过程的学习

  • 输入display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。下面展示每一步时%esp、%ebp和堆栈内容的变化

GDB调试汇编栈堆过程的学习

用si、i r、x/na %esp指令对每一步进行分析

输入si执行一步

GDB调试汇编栈堆过程的学习

调用f函数

输入i r看寄存器的值

GDB调试汇编栈堆过程的学习

用x/2a %esp查看栈堆里的值。因为执行了push $0x8,将0x8推入栈中。esp的值减4。

GDB调试汇编栈堆过程的学习

再输入si执行一步,并输入i r,x/na %esp

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

call指令会将下一条指令的地址入栈。因此,栈堆又增加了一个值,esp的值也相应的减4

重复上述三步

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

因为mov指令不会使栈堆发生变换,所以栈堆中的值不变,esp的值也不变

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

执行push指令,将0x8入栈,esp值减4。调用g函数

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

执行call指令,下一条指令的地址入栈,esp减4

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

push ebp 将%ebp的值入栈,esp减4

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

mov和add没有出栈入栈操作。栈堆不发生变化

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

pop、ret指令进行弹栈操作,栈顶的先出栈。完成一次出栈操作,esp的值加4

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

add $0x4,%esp 将esp的值加4,指针上移,相当于从栈堆弹出一个值

GDB调试汇编栈堆过程的学习

退出f函数。栈顶的值完成出栈操作

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

GDB调试汇编栈堆过程的学习

程序结束,栈堆中所有值都完成出栈,栈堆中为空

汇总表:

GDB调试汇编栈堆过程的学习

问题解决

第一次输入gcc g gdb.c -o gdb -m32报错。

解决方法:sudo apt-get install libc6-dev-i386安装一个库即可