CSAPP 深入理解计算机系统课程实验 bomb实验 反向编译 汇编(4)

本文主要是介绍CSAPP 深入理解计算机系统课程实验 bomb实验 反向编译 汇编(4),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

隐藏关卡。Secretphase

这个隐藏关卡还是很难发现的,自己带的班上的学生中,仅有3个学生发现并解除了炸弹。中间也出现了一些小小问题,在给他们验收的时候也有意识的去引导他们发现一些小问题,并讨论解决。

首先是隐藏关卡的发现,其实在汇编代码中就有一个secret_phase.就是看怎么跳到隐藏关卡了,搜索发现,是通过phase_defused作为入口点的。其实这里可以不分析这个函数,看到在main函数中没通关一关就会调用这个函数,可以在这个函数中设置断点,可以直接利用jump跳到隐藏关卡去做。后面分析这个函数也会发现为什么每次通过一关它会调用,大概是用来比较一下你是否已经全部通关吧。

接下来是常规的进入隐藏关卡:

Phase_defused的汇编代码分析一下:


这里是首先判断一下是否已经通过了六个关卡。


接下来是sscanf函数的调用,在这里有三个ebp的偏移,按照以前通关的经验分析,应该是要输入三个东西,输入的格式规定在立即数0x804a200中查看,另外调用之后的返回值可以发现确实如果输入的小于3就不会进入隐藏关卡。关于sscanf函数一直猜测它的返回值就是输入的个数,没有具体进入去看,但是中间在某一关中输入了123456这6个数,查看了返回值eax居然是2,但是在这里却可以返回大于3的数,所以这个函数也是很有意思的,不像我们猜测的那么简单,但是并不影响我们解除炸弹,我们分析这个sscanf函数应该是根据不同的情况返回不同范围的值,不是具体个数的值,有兴趣的朋友可以自己深入研究一下。

通过gdb调试看看立即数里面的输入的格式,首先先在phasedefused函数中的0x804959处设置断点,是要将全部六个关卡都通过后,跳到断点处。


看到确实是输入三个东西,其中前两个是两个数字,最后一个是一个字符串


再接着就是看到调用了string_not_equal这个函数,调用之前先传参,可以看到,一个是从一个立即数0x804a209中传入的,另外一个则是通过sscanf输入的参数传入的,比较它们要相同才会跳入。


把里面涉及的立即数都给查看一下


可以看到8 1 非常熟悉,就是第四关我们输入的数,可以看到应该就是在第四关的时候除了输入一个8 1之外还在额外输入一个字符串 DrEvil(涉及这个实验的一个博士)就会输出后面那串你发现了隐藏关卡的提示信息。在这里我问班上有一个做了的同学,我说第四关中有几个答案,除了8,1之外还有9,1和11,1,那这样设计不是不合理了啊,输入其他答案的同学必须要用8,1才可以跳。那个同学点点头。其实并不是这样的,字符串比较的时候,传递的参数是-0x5c(%ebp)正好是对应的后面输入的那串字符串,所以前面已经判断你已经通过所有关卡了,这里只要判断你在第四关有没有输入这个字符串。所以只要输入了那三组中其中任一组再加那个字符串就可以通过了。所有的猜想都可以通过调试查看内容来验证一下,接下来就来验证一下,首先现在第四关输入9,1和DrEvil。


输入之后发现果然是这样的。然后进一步看一下每个地方存的是些什么内容。



这样看到传入到string_no_equal的参数确实只是后面的字符串

接下来就要来看看隐藏关中的内容了,


首先是栈的一系列操作,然后对输入的值进行strtol函数的调用stringtolong也就是转换为长整型,而且根据比较可知输入的值减1后要小于等于0x3e8。

接下来可以看到是调用了fun7,调用前先传入参数,可以看到第一个参数是立即数0x804c178中的内容,第二个参数是我们输入的值经过前面的出后的值。看到调用完fun7后的返回值要等于5.


用gdb调试看一下,立即数里面的内容:是一个$符号,对应的ASCII值为36



看到该关主要就是分析fun7调用以后返回值如何是5,接下来就来分析一下fun7这个函数的汇编代码。

首先是栈操作


看出将出入的参数赋值给寄存器,edx,设edx中存的是x,第一次的时候x=36,第二个参数赋值给ecx寄存器中,设为y。


第一种情况,将eax赋值为-1,如果edx中的值为x=0就返回为-1;接下来看第二种情况,


如果x>y,看到后面又调用了fun7看出来fun7是一个递归函数,在前面关卡中我们也遇到过,调用之前要传递参数,将edx偏移0x4再次作为第一个参数x,输入的y作为第二个参数。返回值是做了乘以2的操作。接下来是x==y的情况:


这种情况下,返回值为0。

再看x<y的情况:


这种情况下,也是要递归调用fun7函数,传入的第一个参数变成了edx偏移0x8.第二个参数与为y,返回值为2eax+1.

由于分析返回值必须为5,则只有第三种情况,所以5=4+1(case3),eax=2,2=2*1(case1),所以eax要等于1,1=2*0+1(case3),eax=0(case2)。由于递归调用是从最里面返回的。最里面返回值应该为0.外层递归调用也是case3-case1-case3-case2。不同的是,case3,edx偏移0x8,case1,edx偏移0x4.

按照上面的分析,那么我们输入的数应该就是edx经过(case3-case1-case3-case2)一系列偏移后的值:


由图可知输入的数为0x2f转换为十进制就是47也就是这一关的密钥。

其实后来跟班上同学探讨了一下,发现这个题应该是一个二叉查找树。小于的在一边加0x4,大于的时候在右边加0x8. 就是说输入的是47,比36大,右边走,比50小左边走,又比45大右边走,最后找到了47相等。


                 

至此通过全部关卡:


这篇关于CSAPP 深入理解计算机系统课程实验 bomb实验 反向编译 汇编(4)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/465081

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器  Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方式 直接存储器方式(DMA)  ​编辑 总线 ​编辑

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分