20145218 GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析
虚拟机中分析过程
输入
gcc - g example.c -o example -m32
指令在64位机器上产生32位汇编,但出现以下错误:
这时需要使用
sudo apt-get install libc6-dev-i386
命令安装一个库之后就可以产生汇编代码了。
使用
gdb example
进入gdb,b example.c:main
设置一个函数断点,run
启动程序
disassemble
获取汇编代码,若命令不带参数,默认的反汇编范围是所选择帧的pc附近的函数。info registers
列出使用的寄存器.
使用
x 0xffffd048
指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0。
display,设置程序中断后欲显示的数据及其格式。使用命令
display /i $pc
每次程序中断后可以看到即将被执行的下一条汇编指令,可以
其中 $pc 代表当前汇编指令,/i 表示以十六进行显示。
si
执行一条汇编指令
%esp、%ebp(
info registers
)和堆栈内容的变化(x/na %esp
)
一直使用以上三个指令,观察其变化
call将下一条指令的所在地址(即当时程序计数器PC的内容)入栈
将上一个函数的基址入栈,将当前%esp作为新基址。
准备传参
计算在%eax中进行
查看f函数的汇编代码
执行g函数,g初始化栈指针
g分配栈空间
计算short+in
pop %ebp指令将栈顶弹到%ebp中
ret返回g中call的调用位置
释放当前子程序在堆栈中的局部变量,恢复被函数修改的%ebp和%esp
ret返回f中call的调用位置,结束f函数
主函数汇编代码
进入main函数, %esp加立即数4
将%edx于%eax相加
leave返回准备栈
ret结束main函数
指令 | %eip | %esp | %ebp | %eax | 堆栈 |
---|---|---|---|---|---|
push $0x8 | 0x804840b | 0xffffd048 | 0xffffd048 | 0xf7fb8dbc | 0x0 |
call 0x80483ef | 0x804840d | 0xffffd044 | 0xffffd048 | 0xf7fb8dbc | 0x8 0x0 |
push %ebp | 0x80483ef | 0xffffd040 | 0xffffd048 | 0xf7fb8dbc | 0x8048412 0x8 0x0 |
mov %esp,%ebp | 0x80483f0 | 0xffffd03c | 0xffffd048 | 0xf7fb8dbc | |
mov 0x804a01c,%edx | 0x80483f2 | 0xffffd03c | 0xffffd03c | 0xf7fb8dbc | 0xffffd048 0x8048412 0x8 0x0 |
mov 0x8(%ebp),%eax | 0x80483f8 | 0xffffd03c | 0xffffd03c | 0xf7fb8dbc | 0xffffd048 0x8048412 0x8 0x0 |
call 0x80483db | 0x80483fe | 0xffffd038 | 0xffffd03c | 0xa | 0xa 0xffffd048 0x8048412 0x8 0x0 |
push %ebp | 0x80483db | 0xffffd034 | 0xffffd03c | 0xa | 0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0 |
mov %esp,%ebp | 0x80483dc | 0xffffd030 | 0xffffd03c | 0xa | 0xffffd03c 0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0 |
ret | 0x80483ee | 0xffffd034 | 0xffffd03c | 0xb | 0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0 |
leave | 0x8048406 | 0xffffd03c | 0xffffd03c | 0xb | 0xffffd048 0x8048412 0x8 0x0 |
ret | 0x8048407 | 0xffffd040 | 0xffffd048 | 0xb | 0x8048412 0x8 0x0 |
add $0x4,%esp | 0x8048407 | 0xffffd040 | 0xffffd048 | 0xb | 0x8 0x0 |
leave | 0x804841c | 0xffffd048 | 0xffffd048 | 0xe | |
ret | 0x804841d | 0xffffd04c | 0x0 | 0xe |
20145218 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 + ...
- 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 ...
- 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 ...
随机推荐
- Java线程间通信方式剖析——Java进阶(四)
原创文章,同步发自作者个人博客,转载请在文章开头处以超链接注明出处 http://www.jasongj.com/java/thread_communication/ CountDownLatch C ...
- 利用python检测色情图片简易实例
import sys import os import _io from collections import namedtuple from PIL import Image class Nude( ...
- livecd环境下chroot修复系统
今天想升级centos5.7的glibc版本,想当然的把新编译的glibc的libc-2.7.so 复制到/lib64/libc-2.5.so lrwxrwxrwx root root Mar : / ...
- android使用默认程序进行图片拍照已经裁剪,以及设备读取
//代码如下: package com.cbsw.yulechangsuo.activity; import java.io.File;import java.io.FileInputStream;i ...
- JavaScript局部变量和全局变量的理解
原文链接:http://www.cnblogs.com/eric-qin/p/4166552.html JavaScript局部变量和全局变量的理解 1 2 3 4 5 6 7 8 9 10 &l ...
- jQuery validation学习(1)验证只输入空格通过验证
当input输入了空格是不会提示信息的 一般会去除空格然后进行验证 这个时候就要添加onkeyup事件去除左侧的空格 验证只输入空格通过验证 //添加验证手机方法 jQuery.validator.a ...
- 数据库中的左连接(left join)和右连接(right join)区别
Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select ...
- C++ 中注意,零扩展和符号位扩展
版权声明:本文为博主原创文章,未经博主允许不得转载. 首先,介绍一下两种扩展的定义 转 http://blog.csdn.net/jaylong35/article/details/6160736 符 ...
- Bootstrap_Javascript
弹窗 一. 结构分析 Bootstrap框架中的模态弹出框,分别运用了“modal”.“modal-dialog”和“modal-content”样式,而弹出窗真正的内容都放置在“modal-cont ...
- .NET蓝牙开源库:32feet.NET
在用C#调用蓝牙编程一文中我留个小悬念就是:InTheHand.Net.Personal.dll是怎么来的?这篇文章来解答这个问题,InTheHand.Net.Personal.dll就是来源于今天要 ...