GDB调试汇编堆栈

分析过程

  • C语言源代码
int g(int x)
{
return x+6;
}
int f(int x)
{
return g(x+1);
}
int main(void)
{
return f(5)+1;
}
  • 使用gcc -g exp1.c -o exp1 -m32指令在64位机器上产生32位汇编。

  • 进入gdb调试器。

  • 在main函数处设置一个断点。

  • 使用run指令开始运行程序,返回main函数运行的结果。

  • 使用disassemble指令获取汇编代码。

  • 使用info registers命令查看各寄存器的值。

  • 由上图可以看出,帧指针%ebp在0xbffff2e8,栈指针%esp在0xbffff2e4。

  • x+地址来查看%esp和%ebp的值,此时都为0。

  • display,设置程序中断后欲显示的数据及其格式。例如,如果希望每次程序中断后可以看到即将被执行的下一条汇编指令,可以使用命令

    display /i $pc

    将5压入栈中,传递参数

  • call指令将返回地址压入栈中。

  • f函数汇编代码。

  • 将栈指针的值压入栈中。

  • 帧指针指向栈指针所在位置,以此为基址。

  • 在%eax中计算

  • 将g函数返回值放入%esp所指地址中

  • 将6压入栈中,传递参数

  • 调用g函数,调用call指令将f函数的返回地址压入栈中

  • g函数汇编代码

  • 将栈指针的值压入栈中。

  • 在%eax中计算

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

  • ret将栈顶给%eip

  • leave使栈做好返回的准备,等价于
movl %ebp,%esp //将%ebp的值给%esp
popl %ebp //将栈顶弹到%ebp中
  • ret指令,返回主函数

  • 主函数汇编代码

  • 执行leave后,各寄存器值

序号 指令 %eip %ebp %esp %eax 栈顶->栈底
001 movl $0x5,(%esp) 0x80483e2 0xbffff2e8 0xbffff2e4 0x1 0x5 0x0
002 call 0x80483bf 0x80483bf 0xbffff2e8 0xbffff2e0 0x1 0x80483e7 0x5 0x0
003 push %ebp 0x80483c0 0xbffff2e8 0xbffff2dc 0x1 0xbffff2e8 0x80483e7 0x5 0x0
004 mov %esp,%ebp 0x80483c2 0xbffff2dc 0xbffff2dc 0x1 0xbffff2e8 0x80483e7 0x5 0x0
005 sub $0x4,%esp 0x80483c5 0xbffff2dc 0xbffff2d8 0x1 0xbffff2e8 0x80483e7 0x5 0x0
006 mov 0x8(%ebp),%eax 0x80483c8 0xbffff2dc 0xbffff2d8 0x5 0xbffff2e8 0x80483e7 0x5 0x0
007 add $0x1,%eax 0x80483cb 0xbffff2dc 0xbffff2d8 0x6 0xbffff2e8 0x80483e7 0x5 0x0
008 mov %eax,(%esp) 0x80483ce 0xbffff2dc 0xbffff2d8 0x6 0x6 0xbffff2e8 0x80483e7 0x5 0x0
009 Call 0x80483b4 0x80483b4 0xbffff2dc 0xbffff2d4 0x6 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0
010 push %ebp 0x80483b5 0xbffff2dc 0xbffff2d0 0x6 0xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0
011 Mov %esp,%ebp 0x80483b7 0xbffff2d0 Oxbffff2d0 0x6 0xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0
012 mov 0x8(%ebp),%eax 0x80483ba 0xbffff2d0 0xbffff2d0 0x6 0xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0
013 add $0x6,%eax 0x80483bd 0xbffff2d0 0xbffff2d0 0xc 0xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0
014 Pop %ebp 0x80483be 0xbffff2dc 0xbffff2d4 0xc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0
015 Ret 0x80483d3 0xbffff2dc 0xbffff2d8 0xc 0x6 0xbffff2e8 0x80483e7 0x5 0x0
016 leave 0x80483d4 0xbffff2e8 0xbffff2e0 0xc 0x80483e7 0x5 0x0
017 Ret 0x80483e7 0xbffff2e8 0xbffff2e4 0xc 0x5 0x0
018 add $0x1,%eax 0x80483ea 0xbffff2e8 0xbffff2e4 0xd 0x5 0x0
019 leave 0x80483eb 0x0 0xbffff2ec 0xd 0x0
020 ret 0xb7e3a533 0x0 0xbffff2f0 0xd

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

  1. GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...

  2. 20145212——GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...

  3. gdb调试汇编堆栈过程的学习

    gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...

  4. 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析

    20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...

  5. 赵文豪 GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 使用gdb调 ...

  6. 20145337 GDB调试汇编堆栈过程分析

    20145337 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...

  7. 20145208 GDB调试汇编堆栈过程分析

    20145208 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...

  8. 20145218 GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 虚拟机中分析过程 输入gcc - g example.c -o example -m32指令在64位机器上产生32位汇编,但出现以下错误: 这时需要使用sudo apt-g ...

  9. 20145236 GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 首先需要输入sudo apt-get install libc6-dev-i386安装一个库才能产生汇编代码,然后输入gcc - g example.c -o exampl ...

随机推荐

  1. spring mvc controller间跳转 重定向 传参

    http://blog.csdn.net/jackpk/article/details/19121777/

  2. 全排列算法的JS实现

    问题描述:给定一个字符串,输出该字符串所有排列的可能.如输入“abc”,输出“abc,acb,bca,bac,cab,cba”. 虽然原理很简单,然而我还是折腾了好一会才实现这个算法……这里主要记录的 ...

  3. JAVA基础学习——1.0 Java概述

    Java语言 SUN公司  1995年推出的高级编程语言 ■  主要应用方向 Web开发和Android开发 ■  主要特点 平台无关性:能运行于不同的平台上    安全性:去掉了指针操作,内存由操作 ...

  4. ubuntu-docker-consul-swarm-shipyard-portainer

    --- env --- root@node1:~# cat /etc/issueUbuntu 12.04.4 LTS \n \l root@node1:~# docker -vDocker versi ...

  5. UIPickerView去掉背景上的黑线

    - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger) ...

  6. Js/Jquery获取iframe中的元素

    转载: Js/Jquery获取iframe中的元素 - - ITeye技术网站http://java-my-life.iteye.com/blog/1275205 在web开发中,经常会用到ifram ...

  7. mysqlDBA(1-3年)

    1.熟悉Aliyun操作系统的管理.配置和系统调优: 2.熟悉mysql管理 3.熟悉mysql主从复制,主主复制 4.熟悉数据库的备份策略,监控策略,性能测量策略 5.熟悉linux/unix操作系 ...

  8. 使用#锚点时,jsp中不能有basePath

    今天遇到一个前端问题,使用dtree点击父节点时能够点开,但是之后又left这块frame又回到了登录页面, 难道调用了history(-1)吗,鼠标放上去显示javascript:#,??,回到页面 ...

  9. (原创)ssm sql 例子(freemarker+jsp)

    ssm整合地址:http://www.cnblogs.com/xiaohuihui96/p/6104351.html 接下讲解一个插入语句的流程和顺带讲解freemarker+jsp视图的整合 初次接 ...

  10. 如何在一台服务器上安装两个mysql或者更多

    如何在一台服务器上安装两个mysql 1       前言 上篇写了在一台机器上源码编译安装一个mysql,那么如何在一台机器上源码编译安装两个mysql或者更多呢? 2       环境 mysql ...