《庖丁解牛Linux内核分析》课后实验:实验一:反汇编分析

news2024/11/15 7:39:53

实验内容

参照第 1.3 节,将如下 C 语言代码汇编成“.s”文件,并分析“.s”文件中的汇编代码

的执行过程,其中重点关注 EBP/ESP 寄存器、EAX 寄存器、EIP 寄存器和函数调用堆栈空

间在汇编代码的执行过程是如何变化的。

int g(int x)

{

 return x + 3;

}

int f(int x)

{

return g(x);

}

int main(void)

{

 return f(8) + 1;

}

使用如下命令汇编上述 C 语言代码(以下命令适用于实验楼 64 位 Linux 虚拟机环境):

gcc –S –o main.s main.c -m32

实验过程

(ps.本次实验是在ubutun虚拟机下进行)

1.在ubutun虚拟机的终端下用vi命令编辑main.c文件

2.使用gcc –S –o main.s main.c -m32命令汇编上述代码,在默认目录下得到main.s文件

3.用vi命令打开main.s并对其进行简化

4.分析代码的执行过程

主要参考博客:反汇编分析之函数调用_反汇编调用_、moddemod的博客-CSDN博客

从main入口开始:

首先将ebp压栈,将esp的值存到ebp中,此时esp和ebp指向同一个位置(call和addl行与分析内容无关,不作具体解释)

立即数8是f的参数,将其压入栈后,执行call指令:

首先把call指令的下一条指令addl $4, %esp的地址压入栈中,之后跳转到f的位置:

从pushl %ebp开始,先将调用者main函数的ebp压入栈中,同时将esp的值赋给ebp。然后开辟新的堆栈空间,pushl 8(%ebp)是寄存器基址变址寻址方式,也就是ebp+8所指向的内存空间,将其数值8压入栈中。这里为什么是加8?因为我们是32位系统,mian函数跳转到f的时候,在栈空间存放了main函数的下一条指令的地址,以及ebp的值,两个4字节即8字节就到了我们压入的立即数8的位置。

接着执行call g,同样,将下一条指令的地址压入栈中,跳转到g开始执行:

也是将ebp压栈后,更新esp以及ebp的值;同理movl 8(%ebp), %eax的意思就是将8放到eax寄存器中,addl $3, %eax就是8+3=11存放到eax寄存器中,popl %ebp我们将刚才压入的ebp直接弹栈,恢复ebp的值,同时esp-4指向了f函数call指令压入的下一条指令的地址,执行ret后,将该地址弹到eip中,即实现了跳转,现在回到了addl $4, %esp,这里将esp的指针移动,因为已经恢复eip的值了,到了leave这是一个宏指令,撤销堆栈的意思。因为在该堆栈空间上压入了8,所以需要撤销这块空间,leave等价于

movl %ebp, %esp

popl %ebp

这两条指令,现在esp指向了main函数中call指令的下一条指令addl $4, %esp的地址,执行ret后跳转到该位置,将esp的值加4,addl $1, %eax。因为刚才我们的值保存在eax寄存器中了,这里加1即12+1=13,依然保存在eax寄存器中,leave撤销堆栈,ret直接跳转到调用main函数的系统位置继续后续的处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/467183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

省钱!NewBing硬核新玩法;手把手教你训练AI模特;用AI替代同事的指南;B站最易上手AI绘画教程 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 『NewBing 的2种硬核新用法』阅读文档并回答问题 & AI绘图 社区同学分享了两种NewBing的新用法,不仅准确高效&#x…

2023年湖北省武汉安全员ABC报名时间考试通过率如何?启程别

2023年湖北省武汉安全员ABC报名时间考试通过率如何?启程别 都2023年了,建筑企业想要报考三类人员,不知道在哪里报名,具备什么样的条件才可以报考建筑安全员abc,什么时间报名考试等等一系列问题,启程别来给你们细细说明…

即时通讯源码自己开发好还是对接云服务好

随着科技的飞速发展,通信技术也日新月异。与此同时,即时通讯应用也越来越受欢迎。许多企业在构建应用程序时会遇到一个问题:使用即时通讯源码自己开发好还是对接云服务好?本文将探讨这两种方法的优缺点,并为您提供一些…

环境配置 | Win10 VSCode连接远程服务器里的docker容器

环境:win10, VS code, 远程服务器Ubuntu16.04(远程服务器上已经安装好了dockers), 1.VScode下载 网址:Download Visual Studio Code - Mac, Linux, Windows 下载后双击运行 2.VSCode上配置 STEP 1.点击vscode右边工具栏点击拓展…

《嵌入式系统的WEB开发》

硬件平台:RK1109/T31/RK3308 软件系统:Linux,Lighttpd/ Nginx, FCGI, HTML/JS 选择使用FCGI,除了使用C 开发调用系统资源方便外. FCGI 可以解决CGI 多入口的问题,统一的入口,对数据同步,都是比…

Python 基于 Django 的学生成绩管理系统,可视化界面(附源码,教程)

1简介 对于学生成绩管理系统,充分运用现代化的信息技术手段,对于学生成绩信息管理发展的趋势就是信息化,信息化时代下的信息管理,需要深化信息管理体制与手段的改革,充分运用信息化手段来全方位的进行学生成绩管理系统…

VTK交互功能-callback/observe模式-vtkCommand

前言:本博文为系列博文,尝试将vtk交互功能讲清楚,包括常用的接口分析、常用的交互逻辑以及常用的交互Widget。若各位小伙伴有需要请多多关注,也希望能给各位小伙伴有所帮助。vtkCommand作为callback/obseve交互模式的基类&#xf…

0201自动配置类的导入-自动装配原理-springboot2.7.x系列

1简介 Spring Boot是基于Spring框架的,它的原理也是基于Spring框架的。 Spring框架是一个非常强大的框架,它提供了一系列的模块来帮助开发人员构建企业级的应用程序。Spring框架的核心是控制反转(Inversion of Control,IoC&…

大数据技术之Spark Streaming概述

前言 数据处理延迟的长短 实时数据处理:毫秒级别离线数据处理:小时 or 天 数据处理的方式 流式(streaming)数据处理批量(batch)数据处理 spark Streaming也是基于sparkCore,所以底层的核心没有变…

FreeRTOS系统学习第一步:新建 FreeRTOS 工程—软件仿真

创建一个FreeRTOS系统工程 1.新建工程文件夹2.Keil新建工程2.1 New Project2.2 Select Device For Target2.3 Manage Run-Time Environment 3. 在 KEIL 工程里面新建文件组3.1在 KEIL 工程里面添加文件 4. 编写 main 函数5. 调试配置5.1 设置软件仿真5.2 修改时钟大小在时钟相关…

你是否线上有使用ThreadLocal,如果结合多线程,请慎用

随着业务的增加,数据量的增加,多线程的使用会越来越频繁,提升单机的处理能力。 前些日子我们线上出现了一个比较严重的故障,这个故障是多线程使用不当引起的,挺有代表性的,所以分享给大家,希望…

前端学习笔记:CSS的引入,元素选择器

这是本人学习的总结,主要学习资料如下 马士兵教育 目录 1、引入CSS1.1、引入CSS的方式1.2、优先级 2、元素选择器2.1、基本选择器2.1.1、选择器2.1.2、优先级 2.2、关系选择器2.2.1、优先级 2.3、属性选择器2.4、伪类选择器 1、引入CSS 1.1、引入CSS的方式 第一个…

互斥锁深度理解与使用

大家好,我是易安! 我们知道一个或者多个操作在CPU执行的过程中不被中断的特性,称为“原子性”。理解这个特性有助于你分析并发编程Bug出现的原因,例如利用它可以分析出long型变量在32位机器上读写可能出现的诡异Bug,明明已经把变量…

SpringCloud--gateway 网关

在Spring Cloud中,使用Gateway网关访问服务可以有多种好处,包括但不限于以下几点: 统一入口管理:Gateway作为统一的服务入口,可以对所有的请求进行统一管理和控制,实现微服务集中管理。 动态路由&#xff…

056:cesium 七种方法设置颜色

第056个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置颜色,这里用到了7种方法,查看API,还有很多种方法 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共115行)相关API参考:专栏目标示例效果 配置…

深入理解Go语言中的接口编程【17】

文章目录 接口接口接口类型为什么要使用接口接口的定义实现接口的条件接口类型变量值接收者和指针接收者实现接口的区别值接收者实现接口指针接收者实现接口下面的代码是一个比较好的面试题 类型与接口的关系一个类型实现多个接口多个类型实现同一接口接口嵌套 空接口空接口的定…

TCP教程:详解TCP连接过程

目录标题 一 、简述二 、TCP建立连接协议(三次握手)2.1 概述及目的2.2 第一次握手:客户端发送SYN报文2.3 第二次握手:服务器回应SYN-ACK报文2.4 第三次握手:客户端回应ACK报文2.5 顾客预定座位场景2.6底层原理2.7 TCP …

嵌入式之Samba服务器搭建

在嵌入式系统开发应用平台中,tftp、nfs和samba服务器是最常用的文件传输工具 tftp和nfs是在嵌入式Linux开发环境中经常使用的传输工具 samba则是Linux和Windows之间的文件传输工具。 下面演示在linux上搭建Samba服务器 sudo apt-get install samba chmod -R 77…

会场安排问题——算法实现(C实现)

问题描述:加入要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若每个活动作为图的一个顶点,不相容活动之间用边相连。使相连顶点着有不同颜色的…

数据库原理容易出错的点

一个数据库只存在一个内模式和一个模式,可以存在多个外模式除了删除表或视图的使用的是DELETE以外其他数据库对象均是使用DROP遵守两段封锁的协议的并发事务一定是可串行化的哪些情况下不适合创建索引: 对于查询过程中很少使用或参考的列对于那些只有很少…