GDB调试汇编堆栈
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调试汇编堆栈的更多相关文章
- GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...
- 20145212——GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...
- gdb调试汇编堆栈过程的学习
gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...
- 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 ...
随机推荐
- MarkdownPad 2 在win10下出错:HTML 渲染错误(This view has crashed) 的解决办法 + MarkdownPad2.5 注册码
首先附上MarkdownPad2.5的注册码. 邮箱:Soar360@live.com 授权密钥: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImD ...
- Android控制ScrollView滚动
有两种办法,第一种,使用scrollTo(),这个方法不需要handler,直接调用就行 第二种方式,使用fullScrol() 下面我们看一下这个函数: scrollView.fullScroll( ...
- python之路二十一
URL - 两个 Views - 请求的其他信息 from django.core.handlers.wsgi import WSGIRequest ...
- PHP 查看安装信息
1.运行PHP脚本,查看phpinfo函数的输出. 2.在系统环境变量Path中配好php.exe可执行文件的路径,命令管理器CMD中,执行`php.exe -i`查看. 3.在phpinfo()的输 ...
- highcharts使用笔记
1.legend取消点击事件: 饼图:plotOptions.pie.point.events.legendItemClick = function() {return false;} 其他,如:pl ...
- 我的bootstrapTable的应用
$(function () { //$('#table').attr("data-url", "/conference/" + location.href.sp ...
- 设计模式--适配器模式Adapter(结构型)
一.适配器模式 适配器模式的主要作用是在新接口和老接口之间进行适配.将一个类的接口转换成客户端期望的另外一个接口.其实适配器模式有点无赖之举,在前期设计的时候,我们就不应该考虑适配器模式,而应该通过重 ...
- win10进入安全模式的方法(F8不管用/开不开机)
win10默认不能进入安全模式,这时候开机黑屏怎么办?下面介绍强制进入安全模式的方法 1. 关机情况下,按开机键开机,等到出现徽标(下图),这时候长按开机键强制关机. 2. 再次开机,出现徽标,再次强 ...
- Python类中super()和__init__()的关系
Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...
- 【原创】node+express+socket搭建一个实时推送应用
技术背景 Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新. 应用场景: 监控系统:后台硬件热插拔.LED.温度.电压发生变化 即 ...