GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析
分析过程
这是我的C源文件:click here
使用
gcc - g example.c -o example -m32
指令在64位的机器上产生32位汇编,然后使用gdb example
指令进入gdb调试器:
进入之后先在main函数处设置一个断点,再run一下,使用
disassemble
指令获取汇编代码,用i(info) r(registers)
指令查看各寄存器的值:
可见此时主函数的栈基址为0xffffd068,用
x(examine)
指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0
首先,结合display命令和寄存器或pc内部变量,做如下设置:
display /i $pc
,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。下面展示每一步时%esp、%ebp和堆栈内容的变化:
call指令将下一条指令的地址入栈,此时%esp,%ebp和堆栈的值为:
将上一个函数的基址入栈,从当前%esp开始作为新基址:
先为传参做准备:
实参的计算在%eax中进行:
f函数的汇编代码:
实参入栈:
call指令将下一条指令的地址入栈:
计算short+int:
pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节:
ret指令将栈顶弹给%eip:
因为函数f修改了%esp,所以用leave指令恢复。leave指令先将%esp对其到%ebp,然后把栈顶弹给%ebp:
主函数汇编代码:
指令 | %esp | %ebp | 堆栈 |
---|---|---|---|
push $0x8 | 0xffffd068 | 0xffffd068 | 0x0 |
call 0x80483ef | 0xffffd064 | 0xffffd068 | 0x8 0x0 |
push %ebp | 0xffffd060 | 0xffffd068 | 0x8048412 0x8 0x0 |
mov %esp,%ebp | 0xffffd05c | 0xffffd068 | 0xffffd068 0x8048412 0x8 0x0 |
mov 0x804a01c,%edx | 0xffffd05c | 0xffffd05c | 0xffffd068 0x8048412 0x8 0x0 |
call 0x80483db | 0xffffd058 | 0xffffd05c | 0xa 0xffffd068 0x8048412 0x8 0x0 |
push %ebp | 0xffffd054 | 0xffffd05c | 0x8048403 0xa 0xffffd068 0x8048412 0x8 0x0 |
mov %esp,%ebp | 0xffffd050 | 0xffffd05c | 0xffffd05c 0x8048403 0xa 0xffffd068 0x8048412 0x8 0x0 |
movzwl 0x804a018,%eax | 0xffffd050 | 0xffffd050 | 0xffffd05c 0x8048403 0xa 0xffffd068 0x8048412 0x8 0x0 |
ret | 0xffffd054 | 0xffffd05c | 0x8048403 0xa 0xffffd068 0x8048412 0x8 0x0 |
leave | 0xffffd05c | 0xffffd05c | 0xffffd068 0x8048412 0x8 0x0 |
ret | 0xffffd060 | 0xffffd068 | 0x8048412 0x8 0x0 |
add $0x4,%esp | 0xffffd064 | 0xffffd068 | 0x8 0x0 |
mov $0x3,%edx | 0xffffd068 | 0xffffd068 | 0x0 |
ret | 0xffffd06c | 0x0 |
遇见的问题
使用-m32指令报错:
这是因为编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令
sudo apt-get install libc6-dev-i386
即可
GDB调试汇编堆栈过程分析的更多相关文章
- 20145212——GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...
- 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析
20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...
- 赵文豪 GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 使用gdb调 ...
- 20145337 GDB调试汇编堆栈过程分析
20145337 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
- 20145208 GDB调试汇编堆栈过程分析
20145208 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
- 20145218 GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 虚拟机中分析过程 输入gcc - g example.c -o example -m32指令在64位机器上产生32位汇编,但出现以下错误: 这时需要使用sudo apt-g ...
- 20145236 GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 首先需要输入sudo apt-get install libc6-dev-i386安装一个库才能产生汇编代码,然后输入gcc - g example.c -o exampl ...
- 20145312 GDB调试汇编堆栈过程分析
20145312 GDB调试汇编堆栈过程分析 参考资料 卢肖明同学的博客:<GDB调试汇编堆栈过程分析>: http://www.cnblogs.com/lxm20145215----/p ...
- 20145240 GDB调试汇编堆栈过程分析
20145240 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
随机推荐
- 利用Python进行数据分析(9) pandas基础: 汇总统计和计算
pandas 对象拥有一些常用的数学和统计方法. 例如,sum() 方法,进行列小计: sum() 方法传入 axis=1 指定为横向汇总,即行小计: idxmax() 获取最大值对应的索 ...
- 珍珠(bead)
题目描述 有n颗形状和大小都一致的珍珠,它们的重量都不相同.n为整数,所有的珍珠从1到n编号.你的任务是发现哪颗珍珠的重量刚好处于正中间,即在所有珍珠的重量中,该珍珠的重量列(n+1)/2位.下面给出 ...
- Unmanaged Exports使用方法
Unmanaged Exports,可以利用C#生成非托管的DLL文件. 从https://sites.google.com/site/robertgiesecke/下载UnmanagedExport ...
- QML 从无到有 (基础)
小公司,没办法,什么都得自己亲自来. 服务端是MVC,现在需要可PC客户端和移动APP. 考虑到网页应用有很多界面框架,可以做出很漂亮的界面来,就尝试着使用nwjs来实现,可是在使用了2天的nwjs后 ...
- Hive学习笔记(一)
摘要: Hive 是建立在 Hadoop 上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储.查询和分析存储在 Hadoop 中的大规模数据的机制.H ...
- AEAI ESB培训大纲
1. 概述 本文档的目的是为了让使用者能更好的操作.维护.服务于整个ESB系统平台,该信息系统平台不仅需要成熟稳定的产品,更需要技术熟练的运行维护人员,以便能更好地进行科学有效的运行维护工作. AEA ...
- ArcGIS Engine开发前基础知识(4)
ArcGIS不同开发方式的比较 关于GIS应用软件的开发,通常有三种方式:C/S架构.网络GIS和移动GIS.ArcGIS平台提供了对三种开发方式的支持,对于采用从C/S架构的大多数开发者来讲,首先想 ...
- BCS 字段显示格式化
技术部分 1.使用SPD添加外部数据源时保证,安装SPD的客户机在同一个域中,并且在管理中心给Business Data Connectivity Service 授权 2.生成的外部数据没法再后 ...
- 安卓开发之ListAdapter(二)
今天我们来学习一下ArrayAdapter: ArrayAdapter是安卓中最简单的适配器.使用ArrayAdapter(数组适配器),需要把数据源存 放至数组里面来显示. •构造函数: publi ...
- css揭秘--笔记(未完)
第0章 关于本书 1, 本书要用到一个工具函数————$$(),它可以让我们更容易获取和遍历所有匹配特定css选择符的dom元素: function $$(selector,context){ con ...