CSAPP BOMB LAB part3

CSAPP BOMB LAB part3

phase_4

bomb.s phase_4的代码:
在这里插入图片描述
格式:
在这里插入图片描述
40102e行,比较0x8+rsp的值和0xe, 需要让0x8+rsp小于0xe, 然后跳转到40103a,
在这里插入图片描述
func函数根据bomb.s 转化为c代码:
在这里插入图片描述
这个直接参考了知乎网友的翻译,
在这里插入图片描述
func4的返回值等于0, 跳转到40105d。

汇编语法

jne指令

jne指令是x86汇编语言中的一条条件跳转指令,用于在不相等的情况下进行跳转。

jne指令的语法如下:

jne label

其中,label是一个标签,用于指定跳转的目标位置。

jne指令根据条件码寄存器的值来进行跳转。如果ZF为0,则跳转到label指定的位置。条件码寄存器的ZF位表示零标志位,当上一条指令的结果为零时,ZF被设置为1,否则为0。

下面是一个示例,展示了jne指令的使用:

section .data
    var1 dw 10
    var2 dw 20

section .text
    global _start

_start:
    mov ax, [var1]
    mov bx, [var2]

    cmp ax, bx
    jne not_equal

    ; 如果var1等于var2,则继续执行下面的指令
    ; ...

not_equal:
    ; 如果var1不等于var2,则跳转到not_equal标签处执行相应的代码块
    ; ...

    ; 继续执行下面的指令
    ; ...

end:
    ; 结束程序
    mov eax, 1
    int 0x80

在上面的示例中,我们定义了两个变量var1var2,并将它们的值分别设置为10和20。

然后,我们使用cmp指令比较var1var2的值。根据比较结果,jne指令会根据ZF位的值来决定是否跳转。如果var1不等于var2,即ZF为0,则跳转到not_equal标签处执行相应的代码块;如果var1等于var2,即ZF为1,则继续执行下面的指令。

最后,我们使用系统调用int 0x80来结束程序。

通过使用jne指令,我们可以根据比较结果来进行条件判断和跳转,从而实现不同的代码逻辑分支。

cmpl 指令

cmpl指令是x86汇编语言中的一条比较指令,用于比较两个操作数的值。

cmpl指令的语法如下:

cmpl source, destination

其中,sourcedestination是要比较的操作数。

cmpl指令会将sourcedestination进行比较,并根据比较结果设置条件码寄存器的值。根据比较结果,条件码寄存器的ZF(零标志位)和SF(符号标志位)位会被更新。

下面是一个示例,展示了cmpl指令的使用:

section .data
    var1 dw 10
    var2 dw 20

section .text
    global _start

_start:
    mov ax, [var1]
    mov bx, [var2]

    cmpl ax, bx

    ; 根据比较结果设置的条件码寄存器的值,执行不同的跳转指令
    je equal
    jg greater
    jl less

    ; 继续执行下面的指令
    ; ...

equal:
    ; 如果var1等于var2,则跳转到equal标签处执行相应的代码块
    ; ...

    ; 继续执行下面的指令
    ; ...

greater:
    ; 如果var1大于var2,则跳转到greater标签处执行相应的代码块
    ; ...

    ; 继续执行下面的指令
    ; ...

less:
    ; 如果var1小于var2,则跳转到less标签处执行相应的代码块
    ; ...

    ; 继续执行下面的指令
    ; ...

end:
    ; 结束程序
    mov eax, 1
    int 0x80

在上面的示例中,我们定义了两个变量var1var2,并将它们的值分别设置为10和20。

然后,我们使用mov指令将var1var2的值分别加载到寄存器axbx中。

接下来,我们使用cmpl指令比较axbx的值。根据比较结果,条件码寄存器的ZFSF位会被更新。

根据条件码寄存器的值,我们可以使用条件跳转指令(如jejgjl等)来根据比较结果执行不同的代码逻辑分支。

通过使用cmpl指令,我们可以比较两个操作数的值,并根据比较结果来进行条件判断和跳转。

jbe指令

jbe指令是x86汇编语言中的一条条件跳转指令,用于在无符号数小于或等于的情况下进行跳转。

jbe指令的语法如下:

jbe label

其中,label是一个标签,用于指定跳转的目标位置。

jbe指令根据条件码寄存器的值来进行跳转。如果CF为1或者ZF为1,则跳转到label指定的位置。条件码寄存器的CF位表示进位标志位,当无符号数比较时,如果发生了进位,则CF被设置为1。ZF位表示零标志位,当上一条指令的结果为零时,ZF被设置为1。

下面是一个示例,展示了jbe指令的使用:

section .data
    var1 dw 10
    var2 dw 20

section .text
    global _start

_start:
    mov ax, [var1]
    mov bx, [var2]

    cmp ax, bx
    jbe less_or_equal

    ; 如果var1大于var2,则继续执行下面的指令
    ; ...

less_or_equal:
    ; 如果var1小于或等于var2,则跳转到less_or_equal标签处执行相应的代码块
    ; ...

    ; 继续执行下面的指令
    ; ...

end:
    ; 结束程序
    mov eax, 1
    int 0x80

在上面的示例中,我们定义了两个变量var1var2,并将它们的值分别设置为10和20。

然后,我们使用cmp指令比较var1var2的值。根据比较结果,jbe指令会根据CFZF位的值来决定是否跳转。如果var1小于或等于var2,即CF为1或者ZF为1,则跳转到less_or_equal标签处执行相应的代码块;如果var1大于var2,即CF为0且ZF为0,则继续执行下面的指令。

最后,我们使用系统调用int 0x80来结束程序。

通过使用jbe指令,我们可以根据无符号数的比较结果来进行条件判断和跳转,从而实现不同的代码逻辑分支。

cmpq 指令

在这里插入图片描述

jx 指令

在这里插入图片描述

shr指令

SHR 是汇编语言中的一个指令,用于将一个数值向右移动指定的位数。SHR 是 “Shift Right” 的缩写。它是一种逻辑右移指令,表示将操作数的二进制位向右移动,并用零填充左侧空出的位。

SHR 指令的语法和操作数取决于所使用的汇编语言和体系结构。下面是一个通用的示例:

SHR destination, count
  • destination:目标操作数,表示要进行右移操作的值。可以是寄存器、内存位置或立即数。
  • count:右移的位数。可以是一个立即数或者由寄存器或内存位置提供的数值。

SHR 指令将目标操作数的二进制位向右移动指定的位数。移动后,右侧的位将被丢弃,左侧空出的位将用零填充。移动的位数由 count 指定。

以下是一个示例,展示了如何使用 SHR 指令将寄存器 AL 的值向右移动 1 位:

MOV AL, 0b11001100 ; AL = 0xCC
SHR AL, 1         ; 将 AL 的值向右移动 1 位

; 移动后,AL = 0x66

在上述示例中,AL 寄存器的初始值为 0xCC,即二进制 11001100。通过执行 SHR AL, 1 指令,将 AL 的值向右移动 1 位。移动后,AL 的值变为 0x66,即二进制 01100110

SHR 指令在汇编语言中常用于对数据进行位操作,例如将无符号整数除以 2 的幂次方、提取二进制数的低位等。具体使用时,需要根据具体的需求和上下文进行相应的操作和处理。

sar指令

SAR 是汇编语言中的一个指令,用于将一个数值向右算术移动指定的位数。SAR 是 “Shift Arithmetic Right” 的缩写。它是一种算术右移指令,表示将操作数的二进制位向右移动,并根据符号位进行填充。

SAR 指令的语法和操作数取决于所使用的汇编语言和体系结构。下面是一个通用的示例:

SAR destination, count
  • destination:目标操作数,表示要进行右移操作的值。可以是寄存器、内存位置或立即数。
  • count:右移的位数。可以是一个立即数或者由寄存器或内存位置提供的数值。

SAR 指令将目标操作数的二进制位向右移动指定的位数,并根据符号位进行填充。移动后,右侧的位将被丢弃,左侧空出的位将用符号位进行填充。

以下是一个示例,展示了如何使用 SAR 指令将寄存器 AL 的值向右移动 1 位:

MOV AL, 0b11001100 ; AL = 0xCC
SAR AL, 1         ; 将 AL 的值向右移动 1 位

; 移动后,AL = 0xE6

在上述示例中,AL 寄存器的初始值为 0xCC,即二进制 11001100。通过执行 SAR AL, 1 指令,将 AL 的值向右移动 1 位。移动后,AL 的值变为 0xE6,即二进制 11100110

SAR 指令在汇编语言中常用于对带符号整数进行位操作,例如将带符号整数除以 2 的幂次方、进行有符号数的扩展等。具体使用时,需要根据具体的需求和上下文进行相应的操作和处理

test指令

在这里插入图片描述

参考链接

https://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/lectures/06-machine-control.pdf
https://zhuanlan.zhihu.com/p/106316877

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分治法——找众数

分治法——找众数 要求: 寻找整数数组的众数,如果存在多个众数,则返回权值最小的那个 第一步: 要利用分治法找众数,首先就先要使数组有序。这里,我们用C语言库中的qsort进行快排: qsort(nums…

3D高斯泼溅(Splatting)简明教程

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D场景编辑器 3D 高斯泼溅(Splatting)是用于实时辐射场渲染的 3D 高斯分布描述的一种光栅化技术,它允许实时渲染从小图像样…

直流无刷电机(BLDC)六步换相驱动

直流无刷电机(BLDC)六步换相驱动 文章目录 直流无刷电机(BLDC)六步换相驱动1. 前言2. 六步换相原理3. 电角度与机械角度4. 动手实践4.1 霍尔输出表测量4.2 换向控制4.3 代码编写 5. 总结 1. 前言 直流无刷电机相对直流有刷电机具…

Redis之Java操作Redis的使用

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Redis实战开发》。🎯🎯 …

Android java Handler sendMessage使用Parcelable传递实例化对象,我这里传递Bitmap 图片数据

一、Bundle给我们提供了一个putParcelable(key,value)的方法。专门用于传递实例化对象。 二、我这里传递Bitmap 图片数据,实际使用可以成功传统图像数据。 发送:Bundle bundle new Bundle();bundle.putParcelable("bitmap",bitmap);msg.setD…

【GitLab CI/CD、SpringBoot、Docker】GitLab CI/CD 部署SpringBoot应用,部署方式Docker

介绍 本文件主要介绍如何将SpringBoot应用使用Docker方式部署,并用Gitlab CI/CD进行构建和部署。 环境准备 已安装Gitlab仓库已安装Gitlab Runner,并已注册到Gitlab和已实现基础的CI/CD使用创建Docker Hub仓库,教程中使用的是阿里云的Docker…

【漏洞复现】Apache_Tomcat7+ 弱口令 后台getshell漏洞

感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 说明内容漏洞编号漏洞名称Tomcat7 弱口令 && 后台getshell漏洞漏洞评级高…

【Java】Beanshell下通过java操作Excel(xlsx格式)文件读写

一、概述 在项目开发中往往需要使用到Excel的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后使用POI写到Excel上。 操作Excel目前比较流行的就是Apache POI和阿里巴巴的easyExcel ! Excel文件处理的主流技术包括: Apache POI 、 JXL 、 Alibaba Ea…

机器学习---SVM目标函数求解,SMO算法

1. 线性可分支持向量机 1.1 定义输入数据 假设给定⼀个特征空间上的训练集为: 其中,(x , y )称为样本点。 x 为第i个实例(样本)。 y 为x 的标记: 当y 1时,x 为正例;当y −1时,x…

16. 机器学习 - 决策树

Hi,你好。我是茶桁。 在上一节课讲SVM之后,再给大家将一个新的分类模型「决策树」。我们直接开始正题。 决策树 我们从一个例子开始,来看下面这张图: 假设我们的x1 ~ x4是特征,y是最终的决定,打比方说是…

合肥中科深谷嵌入式项目实战——人工智能与机械臂(六)

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

Python最强自动化神器Playwright!再也不用为爬虫逆向担忧了!

版权说明:本文禁止抄袭、转载,侵权必究! 目录 一、简介+使用场景二、环境部署(准备)三、代码生成器(优势)四、元素定位器(核心)五、追踪查看器(辅助)六、权限控制与认证(高级)七、其他重要功能(进阶)八、作者Info一、简介+使用场景 Playwright是什么?来自Chat…

0001Java安卓程序设计-基于Android多餐厅点餐桌号后厨前台服务设计与开发

文章目录 **摘** **要****目** **录**系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 🐧裙:776871563 摘 要 移动互联网时代的到来,给人们的生活带来了许多便捷和乐趣。随着用户的不断增多,其规模越来越大&#…

linux环境下编译,安卓平台使用的luajit库

一、下载luajit源码 1、linux下直接下载: a、使用curl下载:https://luajit.org/download/LuaJIT-2.1.0-beta3.tar.gz b、git下载地址;https://github.com/LuaJIT/LuaJIT.git 2、Windows下载好zip文件,下载地址:https…

【四、http】go的http的文件下载

一、日常下载图片到本地 //下载文件func downloadfile(url, filename string) {r, err : http.Get(url)if err ! nil {fmt.Println("err", err.Error())}defer r.Body.Close()f, err : os.Create(filename)if err ! nil {fmt.Println("err", err.Error())…

一文详解:传统企业如何把进销存管理流程搬到线上?

进销存管理是企业管理的核心流程之一,它有助于提高效率、降低成本、增加盈利,同时确保客户满意度,这对于企业的长期成功和竞争力至关重要。但在信息化转型的浪潮下,很多企业的传统进销存流程却遇到不少问题。 如果你也在考虑把进…

Navicat连接mysql 8.0.35 2059错误解决办法

这2天在家重装电脑,顺便把mysql升级8.0,安装完成后,用Navicat连接,报错2059,如下 网上查了一下, 【报错原因】mysql8.0 之前的版本中加密规则是 mysql_native_password,而 mysql8.0 之后的版本…

随机微分方程的分数扩散模型 (score-based diffusion model) 代码示例

随机微分方程的分数扩散模型(Score-Based Generative Modeling through Stochastic Differential Equations) 基于分数的扩散模型,是估计数据分布梯度的方法,可以在不需要对抗训练的基础上,生成与GAN一样高质量的图片。…

【Kotlin精简】第7章 泛型

1 泛型 泛型即 “参数化类型”,将类型参数化,可以用在类,接口,函数上。与 Java 一样,Kotlin 也提供泛型,为类型安全提供保证,消除类型强转的烦恼。 1.1 泛型优点 类型安全:通用允许…

CoDeSys系列-4、基于Ubuntu的codesys运行时扩展包搭建Profinet主从环境

CoDeSys系列-4、基于Ubuntu的codesys运行时扩展包搭建Profinet主从环境 文章目录 CoDeSys系列-4、基于Ubuntu的codesys运行时扩展包搭建Profinet主从环境一、前言二、资料收集三、Ubuntu18.04从安装到更换实时内核1、下载安装Ubuntu18.042、下载安装实时内核,解决编…