GDB调试32位汇编堆栈分析

测试源代码

#include <stdio.h>

int g(int x){
return x+5;
} int f(int x){
return g(x)+3;
} int main(ing argv,char *argc[]){
return f(7)+19;
}
  • main函数汇编代码

  • g函数汇编代码

  • f函数汇编代码

调试过程

  • 在汇编调试中单步执行使用si,而display /i $pc该语句可以使得我们每一次单步执行时输出正在执行的语句,i r $xxx则可以输出对应的寄存器中的值,方便我们跟踪调试

  • 根据代码,我们可以知道主函数只有return f(7)+19,在主函数中设下断点,可见当时%eip,%ebp,%esp,%eax的值(%eip为当前执行的指令的地址,%eax用于实参存储,计算,%ebp、%esp用于存储栈指针地址)

  • 调用f函数,call指令将会将下一条指令的地址入栈,且此时esp将会减4

  • 将eip中的值入栈,且此时esp已经发生了变化

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

  • %esp的值减4,将值传入%eax中,并不是太懂这几步到底有什么具体的作用,只知道最后的值实在%eax中进行计算的,大概这几步是为了最后计算做准备





  • call指令将下一条指令地址入栈,开始调用函数g()

  • 地址入栈

  • 这几步和之前调用函数f()那几步作用应该是一样的,可能是传参用途(图值9、10)



  • 实参在%eax中进行计算

  • 出栈,将地址弹到%ebp中

  • ret指令将之前入栈的代码地址弹回%eip中,继续执行函数f()

  • 回到f函数中,进行实参的计算,然后出站,ret将代码地址弹回%eip,继续执行主函数main





  • 在主函数中完成计算,之后代码结束





堆栈分析

指令 %esp %ebp %eip %eax 堆栈
movl $0x7,(%esp) 0xbffff074 0xbffff078 0x8048414 0x1 0x0
call 0x80483f8 0xbffff074 0xbffff078 0x804841b 0x1 0x0
push %ebp 0xbffff070 0xbffff078 0x80483f8 0x1 0x8048420 0x0
mov %esp,%ebp 0xbffff06c 0xbffff078 0x80483f9 0x1 0xbffff078 0x8048420 0x0
sub $0x4,%esp 0xbffff06c 0xbffff06c 0x80483fb 0x1 0xbffff078 0x8048420 0x0
mov 0x8(%ebp),%eax 0xbffff068 0xbffff06c 0x80483fe 0x1 0xbffff078 0x8048420 0x0
mov %eax,(%esp) 0xbffff068 0xbffff06c 0x8048401 0x7 0xbffff078 0x8048420 0x0
call 0x80483ed 0xbffff068 0xbffff06c 0x8048404 0x7 0xbffff078 0x8048420 0x0
push %ebp 0xbffff064 0xbffff06c 0x8048404 0x7 0x8048409 0xbffff078 0x8048420 0x0
mov %esp,%ebp 0xbffff060 0xbffff06c 0x80483ee 0x7 0xbffff06c 0x8048409 0xbffff078 0x8048420 0x0
mov 0x8(%ebp),%eax 0xbffff060 0xbffff060 0x80483f0 0x7 0xbffff06c 0x8048409 0xbffff078 0x8048420 0x0
add $0x5,%eax 0xbffff060 0xbffff060 0x80483f3 0x7 0xbffff06c 0x8048409 0xbffff078 0x8048420 0x0
pop %ebp 0xbffff060 0xbffff060 0x80483f6 0x12 0xbffff06c 0x8048409 0xbffff078 0x8048420 0x0
ret 0xbffff064 0xbffff06c 0x80483f7 0x12 0x8048409 0xbffff078 0x8048420 0x0
add $0x3,%eax 0xbffff068 0xbffff06c 0x8048409 0x12 0xbffff078 0x8048420 0x0
leave 0xbffff068 0xbffff06c 0x804840c 0x15 0xbffff078 0x8048420 0x0
ret 0xbffff070 0xbffff078 0x804840d 0x15 0x8048420 0x0
add $0x13,%eax 0xbffff074 0xbffff078 0x8048420 0x15 0x0
leave 0xbffff074 0xbffff078 0x8048423 0x22 0x0
ret 0xbffff07c 0x0 0x8048424 0x22 0x0

GDB调试32位汇编堆栈分析的更多相关文章

  1. 20145314郑凯杰《信息安全系统设计基础》GDB调试32位汇编堆栈分析

    20145314郑凯杰<信息安全系统设计基础>GDB调试32位汇编堆栈分析 本篇博客将对第五周博客中的GDB调试32位汇编堆栈进行分析 首先放上以前环境配置的图: 图1: 测试代码: #i ...

  2. gdb运行时结合汇编堆栈分析

    一.从源代码文件到可执行文件         从C文件到可执行文件,一般来说需要两步,先将每个C文件编译成.o文件,再把多个.o文件和链接库一起链接成可执行文件.但具体来说,其实是分为四步,下面以ex ...

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

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

  4. 20145219 gdb调试汇编堆栈分析

    20145219 gdb调试汇编堆栈分析 代码gdbdemo.c int g(int x) { return x+19; } int f(int x) { return g(x); } int mai ...

  5. gdb调试汇编堆栈分析

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

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

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

  7. 32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用

    32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用 一丶32位(x86也称为80386)与8086(16位)汇编的区别 1.寄存器的改变 AX 变为 EAX  可以这样想,16位通 ...

  8. 32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式

    32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各 ...

  9. 32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)

    32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议 ...

随机推荐

  1. 在react native用到的javascript 的一些关键知识(整理中)

    发现了一个讲解javascript的好网站,分享一下,讲的非常棒! 注意,这些文章都可以选择中文进行阅读! 下面这个连接是关于prototype的: https://developer.mozilla ...

  2. java序列化

    什么是java序列化,如何实现java序列化? 我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机 ...

  3. iOS 8.0后使用UIAlertController

    iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备尺寸 ...

  4. Quartz资源收藏

    项目中使用Quartz集群分享 : http://hot66hot.iteye.com/blog/1726143 发布 Quartz Job Scheduling Framework 中文 PDF 版 ...

  5. plist文件的读取和xib加载cell

    plist 文件读取 例如在工程里倒入了plist文件 在工程里需要用到plist文件里的信息,就需要把plist文件读取出来. 如程序: -(NSArray *)moreDataArr{ if (! ...

  6. LeetCode之237. Delete Node in a Linked List

    ------------------------------------------------ 因为不知道前序是谁,所以只好采用类似于数组实现的列表移动值, 又因为如果当前是最后一个元素了但是已经没 ...

  7. Linux下的tmpfs文件系统(/dev/shm)

    转自:http://www.2cto.com/os/201411/354888.html 介绍 /dev/shm/是一个使用就是tmpfs文件系统的设备,其实就是一个特殊的文件系统.redhat中默认 ...

  8. x64内核内存空间结构

    0x00 前言 本文主要是讨论Windows 7 x64下的内核虚拟地址空间的结构,可以利用WiinDBG调试的扩展命令"!CMKD.kvas"来显示x64下的内核虚拟地址空间的整 ...

  9. 已解决:ECSHOP安装出现date_default_timezone_get()问题

    今天在安装ECSHOP时遇到警告如下: Warning: date_default_timezone_get(): It is not safe to rely on the system's tim ...

  10. Hibernate的事务处理

    事务:事务就是逻辑上的一组操作,要么全都成功,要么全都失败!!! 事务特性 原子性:事务一组操作不可分割. 一致性:事务的执行前后,数据完整性要保持一致. 隔离性:一个事务在执行的过程中不应该受到其他 ...