二进制炸弹的fp是什么?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  我在解二进制炸弹第四阶段的递归时,对主函数中的片段的理解如下:

8bc4:    e3530002     cmp    r3, #2
8bc8:    1a000005     bne    8be4 <phase_4+0x50>
........
8be4:    eb000275     bl    95c0 <explode_bomb>

输入的第一个数必须是2,否则会爆炸

    8bcc:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec 8bd0:    e3530002     cmp    r3, #28bd4:    da000002     ble    8be4 <phase_4+0x50> 第二个数要大于等于28bd8:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec8bdc:    e3530007     cmp    r3, #7  第二个数要小于78be0:    da000000     ble    8be8 <phase_4+0x54>8be4:    eb000275     bl    95c0 <explode_bomb>```
第二个数必须在[2,7)之间,但是输入了所有组合后却没有能成功的,请问是我的这个思路错了吗?
是我对fp的理解错了吗,我认为fp-8是输入的第一个数,fp-20输入的是第二个数附上完整的phase_4以及递归函数func4```
00008b10 <func4>:8b10:    e92d4810     push    {r4, fp, lr}8b14:    e28db008     add    fp, sp, #88b18:    e24dd00c     sub    sp, sp, #128b1c:    e50b0010     str    r0, [fp, #-16]8b20:    e50b1014     str    r1, [fp, #-20]    ; 0xffffffec8b24:    e51b3010     ldr    r3, [fp, #-16]8b28:    e3530000     cmp    r3, #08b2c:    ca000001     bgt    8b38 <func4+0x28>8b30:    e3a03000     mov    r3, #08b34:    ea000013     b    8b88 <func4+0x78>        r3小于等于0时8b38:    e51b3010     ldr    r3, [fp, #-16]                r3大于0 将r3传入[fp-16]8b3c:    e3530001     cmp    r3, #1                        r3与1进行比较8b40:    1a000001     bne    8b4c <func4+0x3c>8b44:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec        等于1将r3传入[fp-20],return8b48:    ea00000e     b    8b88 <func4+0x78>        8b4c:    e51b3010     ldr    r3, [fp, #-16]8b50:    e2433001     sub    r3, r3, #18b54:    e1a00003     mov    r0, r38b58:    e51b1014     ldr    r1, [fp, #-20]    ; 0xffffffec8b5c:    ebffffeb     bl    8b10 <func4>8b60:    e1a02000     mov    r2, r08b64:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec8b68:    e0824003     add    r4, r2, r38b6c:    e51b3010     ldr    r3, [fp, #-16]8b70:    e2433002     sub    r3, r3, #28b74:    e1a00003     mov    r0, r38b78:    e51b1014     ldr    r1, [fp, #-20]    ; 0xffffffec8b7c:    ebffffe3     bl    8b10 <func4>8b80:    e1a03000     mov    r3, r08b84:    e0843003     add    r3, r4, r38b88:    e1a00003     mov    r0, r38b8c:    e24bd008     sub    sp, fp, #88b90:    e8bd8810     pop    {r4, fp, pc}00008b94 <phase_4>:8b94:    e92d4800     push    {fp, lr}8b98:    e28db004     add    fp, sp, #48b9c:    e24dd020     sub    sp, sp, #328ba0:    e50b0020     str    r0, [fp, #-32]    ; 0xffffffe08ba4:    e51b0020     ldr    r0, [fp, #-32]    ; 0xffffffe08ba8:    e59f1074     ldr    r1, [pc, #116]    ; 8c24 <phase_4+0x90> “%d %d”8bac:    e24b2018     sub    r2, fp, #248bb0:    e24b3014     sub    r3, fp, #208bb4:    ebfffe92     bl    8604 <_init+0x50>   ; 8604:    e28fc600     add    ip, pc, #0, 128bb8:    e1a03000     mov    r3, r08bbc:    e50b3008     str    r3, [fp, #-8]8bc0:    e51b3008     ldr    r3, [fp, #-8]8bc4:    e3530002     cmp    r3, #28bc8:    1a000005     bne    8be4 <phase_4+0x50>8bcc:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec 8bd0:    e3530002     cmp    r3, #28bd4:    da000002     ble    8be4 <phase_4+0x50> 第二个数要大于等于28bd8:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec8bdc:    e3530007     cmp    r3, #7 第二个数要小于78be0:    da000000     ble    8be8 <phase_4+0x54>8be4:    eb000275     bl    95c0 <explode_bomb>8be8:    e3a03005     mov    r3, #58bec:    e50b3010     str    r3, [fp, #-16]8bf0:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec 取第二个数8bf4:    e51b0010     ldr    r0, [fp, #-16]  ; r0=58bf8:    e1a01003     mov    r1, r3        ;r1=r38bfc:    ebffffc3     bl    8b10 <func4>            8c00:    e1a03000     mov    r3, r0        8c04:    e50b300c     str    r3, [fp, #-12] 8c08:    e51b3018     ldr    r3, [fp, #-24]    ; 0xffffffe8 8c0c:    e51b200c     ldr    r2, [fp, #-12]    ;r2 = [fp, #-12]    8c10:    e1520003     cmp    r2, r38c14:    0a000000     beq    8c1c <phase_4+0x88>8c18:    eb000268     bl    95c0 <explode_bomb>8c1c:    e24bd004     sub    sp, fp, #48c20:    e8bd8800     pop    {fp, pc}8c24:    000098a0     .word    0x000098a0

在这里插入图片描述

如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。

解决方案

  如下是上述问题的解决方案,仅供参考:

  在ARM汇编语言中,fp通常指的是"frame pointer"(帧指针),它是一个寄存器,用于指向当前栈帧的开始位置。在有的程序中,fp可能不是必须的,特别是在使用像gcc这样的编译器时,可能会优化掉帧指针的使用。

  从你提供的代码来看,fp被用于访问局部变量。在phase_4函数中,fp被设置为指向比栈顶高4个字节的位置(e28db004),同时栈指针sp被减去32个字节以分配局部变量空间(e24dd020)。这意味着局部变量可以通过相对于fp的偏移量来访问。

  这里是一些关键指令的解释:

  • e51b3014 ldr r3, [fp, #-20]:从fp地址减去20字节的位置加载数据到r3寄存器。这通常用于访问函数的参数或局部变量。
  • e3530002 cmp r3, #2:比较r3寄存器的值和数字2。

  根据你提供的代码,phase_4函数首先检查第一个输入参数(通过r3寄存器,它被加载自[fp, #-20])是否等于2,如果不等则调用explode_bomb函数,触发炸弹爆炸。

  接下来,它检查第二个输入参数(同样通过r3寄存器,再次加载自[fp, #-20]),确保它在2到6的范围内(不包括7)。如果检查失败,同样会触发炸弹爆炸。

  你的思路关于fp的理解基本是正确的。fp-8可能指向第一个输入参数,fp-20指向第二个输入参数。但是,你需要注意的是,ARM架构中函数参数通常通过寄存器传递,而不是通过帧指针的偏移量。这意味着fp-20可能并不是第二个参数的正确偏移,这取决于编译器如何安排寄存器和栈帧。

  为了解决你的问题,你需要正确地识别出哪些寄存器或偏移量用于传递参数,并确保你的输入满足所有条件。如果输入了所有可能的组合后仍然失败,那么可能存在对代码的误解,或者有其他未被注意到的条件。

  如果你需要进一步的帮助,请提供更多的上下文或详细信息,以便更准确地分析和解决问题。

  希望能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏「Bug调优」,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给bugj菌来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 20w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。


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

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

相关文章

微信小程序组件

微信小程序组件课后小结 引言 随着移动互联网的快速发展&#xff0c;微信小程序已经成为开发者和用户的重要选择之一。小程序以其轻量化、易用性和高效性&#xff0c;为开发者提供了一种全新的开发方式&#xff0c;也为用户带来了更加便捷的服务体验。本文将对微信小程序组件的…

BigDecimal 小数位的处理(RoundingMode)

前言&#xff1a; 在日常项目开发中&#xff0c;接触小数是常有的事情&#xff0c;而产品对于小数的处理&#xff0c;在不同的业务中有不同的定义&#xff0c;比如四舍五入、截取、向上舍位、向下舍位等等场景&#xff0c;面对如此多的场景&#xff0c;你是否会束手无策&#…

【算法】优先级队列-基础与应用

优先级队列&#xff08;Priority Queue&#xff09;是一种特殊的队列类型&#xff0c;它允许在其元素中分配优先级。与传统的先进先出&#xff08;FIFO&#xff09;队列不同&#xff0c;优先级队列中元素的出队顺序取决于它们的优先级。优先级较高的元素会被优先处理&#xff0…

IOS Swift 从入门到精通: 结构体的访问控制、静态属性和惰性

文章目录 初始化器引用当前实例惰性属性静态属性和方法访问控制总结初始化器 初始化器是一种特殊方法,可提供创建结构体的不同方式。所有结构体都默认带有一个初始化器,称为成员初始化器- 它会要求您在创建结构体时为每个属性提供一个值。 User如果我们创建一个具有一个属性…

windows桌面运维---第八天

1、如何判断环路&#xff1a; 1、执行ping命令&#xff1a;网络测试时发现丢包严重&#xff0c;可能是环路引起的 2、监控MAC地址漂移&#xff1a;频繁的MAC漂移是环路的一个迹象。 3、通过display interface brief | include up命令&#xff0c;查看所有UP接口下的流量 2、…

【Qt笔记①】帮助文档、窗口、按钮、信号和槽、lambda表达式

学习第一天&#xff1a;2024-3-9 文章目录 Qt creator 快捷键帮助文档默认生成的main.cpp逐行解释核心类帮助文档的查阅方法-①代码创建按钮第一个第二个对窗口的其他设置 对象树窗口坐标系信号和槽&#xff08;优点&#xff1a;松散耦合&#xff09;帮助文档的查阅方法-②找信…

价格减免(Lc2288)——模拟

句子 是由若干个单词组成的字符串&#xff0c;单词之间用单个空格分隔&#xff0c;其中每个单词可以包含数字、小写字母、和美元符号 $ 。如果单词的形式为美元符号后跟着一个非负实数&#xff0c;那么这个单词就表示一个 价格 。 例如 "$100"、"$23" 和 …

轨迹规划系列之S型速度曲线绝对值定位功能块(Codesys源代码)

1、轨迹规划的作用 轨迹规划的作用(前馈速度+位置插补)-CSDN博客文章浏览阅读13次。轨迹规划可以产生运动控制系统位置闭环控制所需要的前馈速度和插补位置值。前馈速度+PID位置闭环控制典型应用可以参考下面文章链接:1、S7-1200PLC和V90伺服通过工艺对象实现定位控制S7-1200…

Java中的加密与解密:实现安全的数据传输

Java中的加密与解密&#xff1a;实现安全的数据传输 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在当今信息安全至关重要的时代&#xff0c;保护数据的安全性…

表驱动法 -优化逻辑分支

表驱动法 -优化逻辑分支 定义 表驱动法&#xff08;Table-Driven Approach&#xff09;是一种编程模式&#xff0c;可以将输入变量作为直接或间接索引在表里查找所需的结果或处理函数&#xff0c;而不使用逻辑语句&#xff08;if-else 和 switch-case&#xff09;。索引表可以…

VMware与windows的共享文件夹没找到怎么办?

如果这样子添加&#xff0c;在ubuntu中还是没能找到。开机后有的时候仍然未发现共享文件夹。 二、解决办法 使用如下指令&#xff1a; sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other /mnt/hgfs/ 是挂载点&#xff0c;也可以指定其它挂载点 -o allow_other…

DHCP原理1-单个局域网出现多个DHCP服务器会发生什么

1. 背景 DHCP全称是Dynamic Host Configuration Protocol。其协议标准是RFC1541&#xff08;已被RFC2131取代&#xff09;&#xff0c;主要实现服务器向客户端动态分配IP地址&#xff08;如IP地址、子网掩码、网关、DNS&#xff09;和配置信息。其系统架构是标准的C/S架构。RFC…

自学SAP是学习ECC版本还是S4版本?

很多人想学SAP&#xff0c;问我应该学ECC版本还是S4版本&#xff0c;我的建议如果你是自学的话&#xff0c;我个人建议使用ECC版本就行&#xff0c;因为这两个版本前台业务和后台配置的操作差异并不大&#xff0c;主要差异在于数据库的差异&#xff0c;前台业务操作和后台系统配…

OS复习笔记ch12-1

文件系统 概述 文件是大多数应用程序的核心要素&#xff0c;文件系统是操作系统对用户来说最重要的部分之一。 本章的主要内容见下图&#xff1a; 文件&#xff0c;大家耳熟能详的就是的docx、pdf、jpg、MP4等各种后缀文件&#xff0c;根据任务需要文件又分成了文本、图片、…

构建可维护的返利系统:最佳实践与常见问题

构建可维护的返利系统&#xff1a;最佳实践与常见问题 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在当今竞争激烈的电商市场中&#xff0c;返利系统作为一…

mediasoup源码分析(七)transport传输

transport传输 一、Tansport 转发到Producer二、RtpStreamRecv 处理收到的包三、数据传输到Router&#xff0c;再分发到Consumertips 一、Tansport 转发到Producer Transport收到数据packet后&#xff0c;会解析出packet中所带的ssrc字段&#xff0c;然后基于ssrc找到该数据的…

超越YOLOv8,飞桨推出精度最高的实时检测器RT-DETR!

众所周知&#xff0c;实时目标检测( Real-Time Object Detection )一直由 YOLO 系列模型主导。 飞桨在去年 3 月份推出了高精度通用目标检测模型 PP-YOLOE &#xff0c;同年在 PP-YOLOE 的基础上提出了 PP-YOLOE 。后者在训练收敛速度、下游任务泛化能力以及高性能部署能力方面…

django使用uuid的坑,据说有外国公司已经为此损失了超1w刀

错误的代码 import uuid from django.db import models class MyModel(models.Model): id models.CharField(max_length32, primary_keyTrue, editableFalse, defaultstr(uuid.uuid4())) # 其他字段...上述代码错误的地方在于&#xff0c;defaultstr(uuid.uuid4())这部分…

我国目前常用的卫星影像星座有哪些(高分二号、高分七号、吉林一号、高景一号······)

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 中国目前的遥感卫星在数量、种类和应用领域上都取得了显著进展&#xff0c;覆盖了陆地、气象、海…

ViT:5 Knowledge Distillation

实时了解业内动态&#xff0c;论文是最好的桥梁&#xff0c;专栏精选论文重点解读热点论文&#xff0c;围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;…