GDB调试汇编分析

GDB调试汇编分析

代码

  • 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学。代码借用的是卢肖明同学的代码进行调试运行。

    GCC编译

  • 使用gcc -g gdbtest.c -o gdbtest -m32命令在64位的机器上产生32位汇编代码
  • 在使用gdb进行调试运行时,有cgdb和gdb两种工具,我建议大家使用张梓靖同学使用的cgdb工具,因为使用时可以随时看到自己的源代码,看到我们的断点在哪里,每一步返回值到了哪行,更加直观。

分析过程

  • 使用b main指令在main函数处设置断点,然后,使用r指令运行代码,使用disassemble指令获取汇编代码
  • 使用display /i $pc(结合display命令和寄存器/pc内部变量)指令进行设置
  • 可见此时主函数的栈基址为0xffffd068,用x(examine)指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0
  • 用i r指令查看各寄存器的值
  • 依次如下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:
  • 1、使用si指令单步跟踪一条机器指令
  • 2、使用i r指令查看各寄存器的值(在这里要看%eip、%eax、%esp和%ebp)
  • 3、使用x/na %esp对应的值指令查看堆栈变化

  • 将上一个函数的基址入栈,从当前%esp开始作为新基址:
  • call指令将下一条指令的地址入栈,此时%esp,%ebp和堆栈的值为:

  • 实参准备入栈:

  • 实参的计算在%eax中进行:

  • 将栈中的数据push

  • push后寄存器中的值发生转变。

  • 函数f修改了%esp,用leave指令恢复。
  • ret结束main函数

总结反思

  • 这次学习让我对于gdb有了更加深刻地认识,设置断点是我们在进行编写代码时在整体编译没有问题,但是却无法得到我们想要的结果时所进行分段纠错步骤,这次的实践让我对于堆栈变化了有了更加深刻的理解,在使用终端三件工具编程时,没有编程软件上自带写好我们拿来就用的断点设置按钮,之后若是遇到这样的问题我们只能自己动手去做,所以说这次的实践又是我们掌握的一件有力的linux中C语言编程工具。

gdb调试分析汇总表


时间: 2024-10-13 09:22:37

GDB调试汇编分析的相关文章

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),如若想获取此时的汇编代码,可用指令:disassemb

20145311利用gdb调试汇编代码

利用GDB调试汇编代码 首先编写c语言原代码,我使用的是同学分析过的代码 #include<stdio.h>short addend1 = 1;static int addend2 = 2;const static long addend3 = 3; static int g(int x){    return x + addend1;} static const int f(int x){    return g(x + addend2);} int main(void){    retur

20145239 GDB调试汇编堆栈过程分析

20145239 GDB调试汇编堆栈过程分析 测试源代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const static long addend3 = 3; static int g(int x) { return x + addend1; } static const int f(int x) { return g(x + addend2); } int main(void) { return f(8) +

GDB调试汇编堆栈过程分析

首先我自己编译个代码,无非就是调用函数吗. 在这里我先大致手绘了一张整个程序在存储空间的汇编代码(根据P239上的汇编代码) 然后对其进行汇编.进入gdb,获得main的汇编代码. 给 sum 设置断点 获取sum的汇编代码 首先我分析一下该汇编代码: 按照书上P238所讲的,首先会初始化&esp和%ebp,这里并没有看到,我猜测是因为我们所设置的断电是给main函数的,所以只显示执行main时的汇编代码. 初始化栈指针和帧指针之后,就执行call main,然后%ebp入栈,%ebp保存%es

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析(1)

堆栈跟踪 首先编辑一个程序 用gcc编译,再使用gdb调试,发现gdb尚未下载 下载后重新运行gdb 设置断点:b+行号或者"main" 运行:r frame:打印出的信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句. info frame:打印出的信息:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的.函数参数地址及值.局部变量的地址等等. 输入命令disassemble:显示出该代码(main())的汇编形式 info

Linux下的栈溢出案例分析-GDB调试操练

摘要:  本文主要演示linux平台下的栈溢出,首先根据理论对示例代码进行溢出攻击:结果是溢出攻击成立,但是与设想的有差别:然后采用GDB调试工具对发生的意外,进行深入的分析. 测试的平台: 1.  ubuntu 9;   gcc 4.4.1;   Gdb 7.0-ubuntu 2.  ubuntu系统安装在virtual box 3.2.8虚拟机上: 示例代码如下: #include<string.h> void overflow(char* arg) { char buf[12]; str

linux平台学x86汇编(五):使用gdb调试汇编程序

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 正如C语言一样,编写所有语言程序一样会出现一些一些错误,发生错误时,我们可以使用调试器一步一步运行程序以监视数据是如何被处理的.本节使用GNU调试器检查上一节hello程序,监视处理过程中寄存器和内存的值的变化.要调试汇编语言程序,在编译时,需要使用-gstabs参数重新汇编源代码,使用了该参数编译出来的可执行文件要比之前稍大一些,因为添加了附加信息.上一节程序不使用-gst

nginx源码分析--GDB调试

利用gdb[i]调试nginx[ii]和利用gdb调试其它程序没有两样,不过nginx可以是daemon程序,也可以以多进程运行,因此利用gdb调试和平常会有些许不一样.当然,我们可以选择将nginx设置为非daemon模式并以单进程运行,而这需做如下设置即可: daemon off; master_process off; 这是第一种情况: 这种设置下的nginx在gdb下调试很普通,过程可以[iii]是这样: 执行命令: [email protected]:/usr/local/nginx/

nginx源代码分析--GDB调试

利用gdb[i]调试nginx[ii]和利用gdb调试其他程序没有两样,只是nginx能够是daemon程序,也能够以多进程执行,因此利用gdb调试和寻常会有些许不一样. 当然,我们能够选择将nginx设置为非daemon模式并以单进程执行.而这需做例如以下设置就可以: daemon off; master_process off; 这是第一种情况: 这样的设置下的nginx在gdb下调试非常普通,过程能够[iii]是这样: 运行命令: [email protected]:/usr/local/