20145316GDB调试汇编堆栈

GDB调试例子的汇编堆栈

  • 代码
  • 直接-m32编译出现问题
  • 编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386
  • 编译成功,进入gdb调试界面
  • 在main处设置断点、运行并获取汇编代码查看各寄存器状态

  • 主函数栈基址为0xffffd104,值为0

  • call指令将下一条指令地址入栈,%esp、%ebp值发生变化

  • 上一个函数的基址入栈,从当前%esp开始作为新基址,原地址压栈保存

  • 为传参做准备

  • 实参计算在%eax中进行

  • f函数汇编代码

  • 实参入栈

  • call指令将下一条指令的地址入栈




  • 计算short+int

  • pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节



  • ret指令将栈顶弹给%eip


堆栈情况


指令


%esp


%ebp


堆栈


movl$0x8,(%esp)


0ffffd104


0ffffd108


0x0


call 0x8048401


0ffffd100


0ffffd108


0x8 0x0


push %ebp


0ffffd100


0ffffd108


0x804842e 0x8 0x0


mov %esp,%ebp


0ffffd0fc


0ffffd108


0xffffd108 0x804842e 0x8 0x0


mov 0x804a01c,%edx///


0ffffcf6c


0ffffcf6c


0xffffcf78 0x804842e 0x8 0x0


call 0x80483ed


0ffffd0f8


0ffffd0fc


0xa 0xffffd108 0x804842e 0x8 0x0


push %ebp


0ffffd0f4


0ffffd0fc


0x804841a 0xa 0xffffd108 0x804842e 0x8 0x0


mov %esp,%ebp


0ffffd0f0


0ffffd0fc


0xffffd0fc 0x804841a 0xa 0xffffcd108 0x804842e 0x8 0x0


movzwl 0x804841a,%eax


0ffffd0f0


0ffffd0f0


0xffffd0fc 0x804841a 0xa 0xffffcd108 0x804842e 0x8 0x0


ret


0ffffd0f4


0xffffd0fc


0x804841a 0xa 0xffffcd108 0x804842e 0x8 0x0


leave


0ffffd0f8


0ffffd0fc


0xa 0xffffcd108 0x804842e 0x8 0x0


ret


0ffffd100


0ffffd108


0x804842e 0x8 0x0


leave


0ffffd104


0ffffd108


0x8 0x0


ret


0xffffd10c


0x0

 
时间: 2024-10-11 10:22:20

20145316GDB调试汇编堆栈的相关文章

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

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) +

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

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

GDB调试汇编堆栈过程分析

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

GDB调试汇编分析

GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdbtest -m32命令在64位的机器上产生32位汇编代码 在使用gdb进行调试运行时,有cgdb和gdb两种工具,我建议大家使用张梓靖同学使用的cgdb工具,因为使用时可以随时看到自己的源代码,看到我们的断点在哪里,每一步返回值到了哪行,更加直观. 分析过程 使用b main指令在main函数处设置

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

linux 下调试 汇编

gcc: -c 编译后汇编,不连接 -S 编译后停止,不进行汇编 -o 编译,汇编,连接 -g 生成调试信息 -gstabs 标识符 main gdb break *标识符 :设置断点 info register :参看寄存器 run :运行 list :列出函数行 objdump: -d : 目标代码反汇编 默认text -D :所有代码

程序的调试(堆栈的使用)

换新工作一个月,以前是做自动化测试的,对于代码的编译,调试一直都是停留在数据的输出,显示等层面的调试,从来没有考虑到更深的一层.汗颜. 正如领导所说.对于任何一个成熟的框架来说,都会有相应的log输出,如果仅仅是将将数据输出,显示进行调试,太机械了.作为一个开发人员,如何高效的的工作,高效的解决问题,这才是关键. 哈哈,不扯了,进入正题. 最近,在做一个线下网站的性能测试,需要找出线下网站的响应时间作为判断的标准.切入正题了.对于任何一个编程语言来说,都有对应的堆栈函数,便于用户进行调试程序,监

20145301赵嘉鑫《网络对抗》逆向及Bof基础

20145301赵嘉鑫<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell.正常情况下这个代码是不会被运行的.我们实践的目标就是想办法运行这个代码片段. 本次实践主要是学习两种方法: 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数. 手工修改可执