20145219 gdb调试汇编堆栈分析

代码gdbdemo.c

int g(int x)
{
return x+19;
} int f(int x)
{
return g(x);
} int main(void)
{
return f(19)+19;
}

gcc编译gdbdemo.c

  • 使用gcc -g gdbdemo.c -o gdbdemo -m32命令在64位的机器上产生32位汇编代码

  • 在产生32位汇编代码时可能会出现如下错误:

  • 解决方法是在终端输入如下命令:sudo apt-get install libc6-dev-i386,安装一个库

  • 安装成功后再次执行gcc -g gdbdemo.c -o gdbdemo -m32命令就可以顺利进行下一步了

gdb调试可执行文件gdbdemo

  • 使用gdb gdbdemo指令打开gdb调试器

  • 使用break main指令在main函数处设置断点(可以使用l指令在屏幕上打印代码),然后,使用r指令运行代码,可以看到运行时在main函数位置停了下来

  • 使用disassemble指令获取汇编代码(因为之前执行的命令中有-m32,所以此处显示的是32位汇编代码)

  • i r指令查看各寄存器的值

  • 可见此时主函数的栈基址为0xffffd058,用x 0xffffd058指令查看内存地址中的值:

    因此,目前%esp所指堆栈内容为0,%ebp所指内容也为0

  • ,使用display /i $pc(结合display命令和寄存器/pc内部变量)指令进行设置

    这使得在每次执行下一条汇编语句时,都会显示出当前执行的语句,方便查看。

  • 依次如下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:

    • 1、使用si指令单步跟踪一条机器指令
    • 2、使用i r指令查看各寄存器的值(在这里要看%eip、%eax、%esp和%ebp)
    • 3、使用x/na %esp对应的值指令查看堆栈变化

    之后一直重复执行上述三步,直至结束

  • main函数汇编代码

  • f函数汇编代码

  • g函数汇编代码

  • 从main函数开始,push $0x13分配4字节的栈空间,并且设置arg1=19

  • call调用f(0x80483e6)

  • 执行f函数,f初始化帧指针,将上一个函数的基址入栈,将当前%esp作为新基址

  • f分配栈空间,为传参做准备

  • pushl 0x8(%ebp)将%esp中的8存入栈中

  • call调用g(0x80483db)

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

  • g分配栈空间

  • pushl 0x8(%ebp)将%esp中的8存入栈中

  • 将 %eax 与立即数 19 相加

  • pop %ebp在g结束前弹栈

  • ret返回g中call的调用位置,结束g函数

  • 将 %esp 与立即数 4 相加

  • leave返回准备栈

  • ret返回f中call的调用位置,结束f函数

  • 进入main函数,将 %esp 与立即数 4 相加

  • 将 %eax 与立即数 19 相加

  • leave返回准备栈

  • ret结束main函数

gdb调试分析汇总表

指令 %eip %ebp %esp %eax 堆栈
push $0x13 0x80483f9 0xffffd058 0xffffd058 0xf7fbadbc 0x00000000
call 0x80483e6 0x80483fb 0xffffd058 0xffffd054 0xf7fbadbc 0x13 0x0
push %ebp 0x80483e6 0xffffd058 0xffffd050 0xf7fbadbc 0x8048400 0x13 0x0
mov %esp,%ebp 0x80483e7 0xffffd058 0xffffd04c 0xf7fbadbc 0xffffd058 0x8048400 0x13 0x0
pushl 0x8(%ebp) 0x80483e9 0xffffd04c 0xffffd04c 0xf7fbadbc 0xffffd058 0x8048400 0x13 0x0
call 0x80483db 0x80483ec 0xffffd04c 0xffffd048 0xf7fbadbc 0x13 0xffffd058 0x8048400 0x13 0x0
push %ebp 0x80483db 0xffffd04c 0xffffd044 0xf7fbadbc 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0
mov %esp,%ebp 0x80483dc 0xffffd04c 0xffffd040 0xf7fbadbc 0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0
mov 0x8(%ebp),%eax 0x80483de 0xffffd040 0xffffd040 0xf7fbadbc 0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0
add $0x13,%eax 0x80483e1 0xffffd040 0xffffd040 0x13 0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0
pop %ebp 0x80483e4 0xffffd040 0xffffd040 0x26 0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0
ret 0x80483e5 0xffffd04c 0xffffd044 0x26 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0
add $0x4,%esp 0x80483f1 0xffffd04c 0xffffd048 0x26 0x13 0xffffd058 0x8048400 0x13 0x0
leave 0x80483f4 0xffffd04c 0xffffd04c 0x26 0xffffd058 0x8048400 0x13 0x0
ret 0x80483f5 0xffffd058 0xffffd050 0x26 0x8048400 0x13 0x0
add $0x4,%esp 0x8048400 0xffffd058 0xffffd054 0x26 0x13 0x0
add $0x13,%eax 0x8048403 0xffffd058 0xffffd058 0x26 0x0
leave 0x8048406 0xffffd058 0xffffd058 0x39
ret 0x8048407 0x0 0xffffd05c 0x39

参考资料

20145219 gdb调试汇编堆栈分析的更多相关文章

  1. 20145318 GDB调试汇编堆栈分析

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

  2. 20145310 GDB调试汇编堆栈分析

    GDB调试汇编堆栈分析 由于老师说要逐条分析汇编代码,所以我学习卢肖明同学的方法,重新写了一篇博客. 代码: #include<stdio.h> short addend1 = 1; st ...

  3. gdb调试汇编堆栈分析

    代码(src/05/gdb.c) int g(int x) { return x + 4; } int f(int x) { return g(x); } int main(void) { retur ...

  4. GDB调试汇编堆栈

    GDB调试汇编堆栈 分析过程 C语言源代码 int g(int x) { return x+6; } int f(int x) { return g(x+1); } int main(void) { ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. linux crontab & 每隔10秒执行一次

    linux下定时执行任务的方法  在LINUX中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /clearigame2内容到里面 :wq 保存退出. 在LINU ...

  2. 《Swift开发指南》

    <Swift开发指南> 基本信息 作者: 关东升    赵志荣 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115366245 上架时间:2014-8-5 出版日期:20 ...

  3. linux下重启oracle服务:监听器和实例

    一.在Linux下重启Oracle数据库及监听器: 方法1: 用root以ssh登录到linux,打开终端输入以下命令: cd $ORACLE_HOME #进入到oracle的安装目录 dbstart ...

  4. 问题解决——multimap中统计key的种类

    ================声明================= 本文原创,转载请注明出处和作者,并保持文章的完整性. 本文链接:http://www.cnblogs.com/wlsandwho ...

  5. ls文件与目录检视,文件内容查阅

    -a 列出所有的(含隐藏的)文件,包括.和.. -A 列出所有的(含隐藏的)文件,不包括.和.. -d 仅列出目录本身,而不是列出目录内的文件数据(常用) -f 不进行排序,直接列出结果,ls默认会以 ...

  6. 异机恢复perform restores

    Restoring and Recovering the database on a new host 第一台机器上mount模式下做全备   new host:   1.配置oracle_sid和之 ...

  7. C++STL之迭代器

    迭代器 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值.例如, ...

  8. SSH applicationContext.xml文件配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. uva 120 stacks of flapjacks ——yhx

     Stacks of Flapjacks  Background Stacks and Queues are often considered the bread and butter of data ...

  10. Django数据库怎么给字段设置主键

    id = models.IntegerField(primary_key = True) 附: null :缺省设置为false.通常不将其用于字符型字段上,比如CharField,TextField ...