GDB调试汇编堆栈
GDB调试汇编堆栈 准备工作 终端编译工具: 编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386 测试代码: test.c 分析过程 1.生成汇编代码:gcc -g gdbtest.c -o gdbtest -m32 2.调试:gdb test 3.设置断点,因为目的是分析而不是调试bug,所以我们将断点设置在main函数 4.开始gdb调试:r(un),如若想获取此时的汇编代码,可用指令:disassemble 5.此时可以用指令查看寄存器的值:i(nfo) r(egisters),显示的格式为3列: 第1列:寄存器名称 第2列:寄存器的地址 第3列:寄存器中存的值 6:结合display命令和寄存器或pc内部变量,做如下设置:display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。下面展示每一步时%esp、%ebp和堆栈内容的变化: 过程(截图中的指令实际上是待执行指令) 初始 push $0x7 call 0x80483e8 call调用f(0x80483e8) push %ebp 执行f函数,f初始化帧指针,将上一个函数的基址入栈,将当前%esp作为新基址 mov %esp,%ebp 分配栈空间,为传参做准备 pushl 0x8(%ebp) 将