GDB调试汇编堆栈过程分析

测试代码

#include <stdio.h>

short val = 1;
int vv = 2;
int g(int xxx) {
return xxx + vv;
} static const int f(int xx)
{
return g(xx);
} int main(void)
{
return f(9)+ val;
}

分析过程

  • 通过gcc - g gdb.c -o gdb -m32指令在64位的机器上产生32位汇编

  • 进入gdb调试,先在main函数处设置一个断点,再run一下,使用disassemble指令获取汇编代码

main函数汇编代码:



g函数汇编代码:



f函数汇编代码:

  • 通过info registers列出使用的寄存器.

  • 此时主函数的栈基址为0xffffd028,用x(examine)指令查看内存地址中的值,目前%esp所指堆栈内容为0,%ebp所指内容也为0

  • 结合display命令和寄存器或pc内部变量,做如下设置:display /i $pc,其中$pc代表当前汇编指令,/i表示以十六进行显示。这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。

  • 使用si执行下一条指令、%esp、%ebpinfo registers和堆栈内容的变化x/na %esp

    1.call将下一条指令的所在地址(即当时程序计数器PC的内容)入栈



    2.将上一个函数的基址入栈,将当前%esp作为新基址



    3.准备传参



    4.call指令将下一条指令的地址入栈,此时%esp,%ebp和堆栈的值为:



    6.执行g函数,g初始化栈指针



    7.计算short+int



    8.pop %ebp指令将栈顶弹到%ebp中



    9.ret返回g中call的调用位置



    10.leave返回准备栈



    11.ret结束main函数



    12.%esp加立即数4

指令 %eip %esp %ebp %eax 堆栈
push $0x9 0x8048400 0xffffd024 0xffffd028 0xf7fb7dbc 0x0
call 0x80483eb 0x8048400 0xffffd020 0xffffd028 0xf7fb7dbc 0x9 0x0
push %ebp 0x80483eb 0xffffd020 0xffffd028 0xf7fb7dbc 0x8048405 0x9 0x0
mov %esp,%ebp 0x80483ec 0xffffd01c 0xffffd028 0xf7fb7dbc 0xffffd028 0x8048405 0x9 0x0
pushl 0x8(%ebp) 0x80483ee 0xffffd01c 0xffffd01c 0xf7fb8dbc 0xffffd028 0x8048405 0x9 0x0
call 0x80483db 0x80483f1 0xffffd018 0xffffd01c 0xf7fb8dbc 0x9 0xffffd028 0x8048405 0x9 0x0
push %ebp 0x80483db 0xffffd014 0xffffd01c 0xf7fb8dbc 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0
mov %esp,%ebp 0x80483dc 0xffffd010 0xffffd01c 0xf7fb8dbc 0xffffd01c 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0
mov 0x804a01c,%edx 0x80483de 0xffffd010 0xffffd010 0xf7fb7dbc 0xffffd01c 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0
mov 0x8(%ebp),%eax 0x80483e4 0xffffd010 0xffffd010 0xf7fb7dbc 0xffffd01c 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0
add %edx,%eax 0x80483e7 0xffffd010 0xffffd010 0x9 0xffffd01c 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0
pop %ebp 0x80483e9 0xffffd010 0xffffd010 0xb 0xffffd01c 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0
ret 0x80483ea 0xffffd014 0xffffd01c 0xb 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0
add $0x4,%esp 0x80483f6 0xffffd018 0xffffd01c 0xb 0x9 0xffffd028 0x8048405 0x9 0x0
leave 0x80483f9 0xffffd01c 0xffffd01c 0xb 0xffffd028 0x8048405 0x9 0x0
ret 0x80483fa 0xffffd020 0xffffd028 0xb 0x8048405 0x9 0x0
add $0x4,%esp 0x8048405 0xffffd024 0xffffd028 0xb 0x9 0x0
mov %eax,%edx 0x8048405 0xffffd028 0xffffd028 0xb 0x0

20145212——GDB调试汇编堆栈过程分析的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    20145312 GDB调试汇编堆栈过程分析 参考资料 卢肖明同学的博客:<GDB调试汇编堆栈过程分析>: http://www.cnblogs.com/lxm20145215----/p ...

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

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

随机推荐

  1. EF里如何定制实体的验证规则和实现IObjectWithState接口进行验证以及多个实体的同时验证

    之前的Code First系列文章已经演示了如何使用Fluent API和Data Annotation的方式配置实体的属性,比如配置Destination类的Name属性长度不大于50等.本文介绍E ...

  2. Thread Object wait() notify()基本

    package com.thread.test.thread; import java.util.ArrayDeque; import java.util.Queue; import java.uti ...

  3. Yii2.0.7 限制user module登录遇到的问题

    在Yii2.0.6的时候我是在以下文件通过以下方法实现的. frontend/modules/user/Module.php namespace frontend\modules\user; clas ...

  4. 编译安装zabbix3.2

    1.1 环境准备 系统环境准备:redhat 6.6 64位mysql-5.6.34php-5.6.28zabbix-3.2.1配置前先关闭iptables和SELINUX,避免安装过程中报错. # ...

  5. OC中加载html5调用html方法和修改HTML5内容

    1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webViewDidFinishLoad: 4.在代理方法中进行操作H ...

  6. 项目游戏开发日记 No.0x000004

    14软二杨近星(2014551622) 还有两周就要交项目了, 我们的作品, 作为作业, 好吧, 其实它完成了接近50%, (only the first bate), 其实也是各种各种忙, 然后才赶 ...

  7. Resources.Load加载文件返回null的原因

    1.文件夹都要放在Resources目录下 2.加载时photoName不需要扩展名 Texture2D t = Resources.Load<Texture2D>("Loadi ...

  8. 谈c++ pb_ds库(二) 红黑树大法好

    厉害了,没想到翻翻pb_ds库看到这么多好东西,封装好的.现成的splay.红黑树.avl... 即使不能在考场上使用也可以用来对拍哦 声明/头文件 #include <ext/pb_ds/tr ...

  9. Linux ——————用Secure传文件时直接拖了文件用的是AssIC导致linux那边直乱码

    如下: 解决办法: 直接删除.

  10. [LeetCode] Pacific Atlantic Water Flow 太平洋大西洋水流

    Given an m x n matrix of non-negative integers representing the height of each unit cell in a contin ...