GDB调试32位汇编堆栈分析
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位汇编堆栈分析的更多相关文章
- 20145314郑凯杰《信息安全系统设计基础》GDB调试32位汇编堆栈分析
20145314郑凯杰<信息安全系统设计基础>GDB调试32位汇编堆栈分析 本篇博客将对第五周博客中的GDB调试32位汇编堆栈进行分析 首先放上以前环境配置的图: 图1: 测试代码: #i ...
- gdb运行时结合汇编堆栈分析
一.从源代码文件到可执行文件 从C文件到可执行文件,一般来说需要两步,先将每个C文件编译成.o文件,再把多个.o文件和链接库一起链接成可执行文件.但具体来说,其实是分为四步,下面以ex ...
- 20145318 GDB调试汇编堆栈分析
20145318 GDB调试汇编堆栈分析 代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const sta ...
- 20145219 gdb调试汇编堆栈分析
20145219 gdb调试汇编堆栈分析 代码gdbdemo.c int g(int x) { return x+19; } int f(int x) { return g(x); } int mai ...
- gdb调试汇编堆栈分析
代码(src/05/gdb.c) int g(int x) { return x + 4; } int f(int x) { return g(x); } int main(void) { retur ...
- 20145310 GDB调试汇编堆栈分析
GDB调试汇编堆栈分析 由于老师说要逐条分析汇编代码,所以我学习卢肖明同学的方法,重新写了一篇博客. 代码: #include<stdio.h> short addend1 = 1; st ...
- 32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用
32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用 一丶32位(x86也称为80386)与8086(16位)汇编的区别 1.寄存器的改变 AX 变为 EAX 可以这样想,16位通 ...
- 32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式
32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各 ...
- 32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)
32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议 ...
随机推荐
- 没听说过这些,就不要说你懂并发了,three。
引言 很久没有跟大家再聊聊并发了,今天LZ闲来无事,跟大家再聊聊并发.由于时间过去的有点久,因此LZ就不按照常理出牌了,只是把自己的理解记录在此,如果各位猿友觉得有所收获,就点个推荐或者留言激励下LZ ...
- [jquery]折叠指定条件的表格
最近在做财务报表时候,一些表格要做特定折叠效果 这里通过2个自定义属性来对表格之间的属性作关联 date-head和date-num,输出表格时候,可以按照这2个自定义属性给某些带父子层级关系的内容指 ...
- 个人Win10 +archlinux安装笔记
win10+archlinux 1.查看磁盘并分区并挂载1.1 分区/dev/sda1 WIN10 保留分区/dev/sda2 WIN10 ESP分区(EFI)/dev/sda3 WIN10 MSR分 ...
- 仿qq联系人 学习笔记---ExpandableListActivity的使用
[转]原地址 http://blog.163.com/xygzx@126/blog/static/237809502011102010100331/ 效果显示图: 1.布局文件 main.xml(E ...
- 为何Redis要比Memcached好用(转)
转载链接:http://blog.csdn.net/renfufei/article/details/40598889 GitHub版本地址: https://github.com/cncounter ...
- UVA 10780 Again Prime No Time.(数学)
给定两个整数m和n,求最大的k使得m^k是n!的约数 对m质因子分解,然后使用勒让德定理求得n!包含的质数p的阶数,min(b[i] / a[i])即为结果k, 若为0无解 #include<c ...
- MIS系统开发利器,快速的字典录入解决方案,另类的、可管理的.NET DataWindow
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- 当年只会C# 所以写C++就成这样了!
这应该是4-5年前了. 当年之会c#敲敲代码也不会C++但深信开发这东西只要思想有了. 只是语法问题. 对于C++这貌似只有大牛才能胜任的,而对于我来说是如此困难. 所以想想办法搞了很多通用类来避免C ...
- UWP 图片剪切旋转工具
好久没撸随笔了,明天终于放假休息了..准备去进行信仰充值,看<魔兽>去(话说surface phone 好久出,让我这个做UWP的也充点信仰..) 先上下效果图: 在设计中,遇到一个问题, ...
- Html 移动web开发细节处理
1.-webkit-tap-highlight-color:rgba(255,255,255,0)可以同时屏蔽ios和android下点击元素时出现的阴影.备注:transparent的属性值在and ...