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

相关文章

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

深入解析Java NIO在高并发场景下的性能优化实践指南

《深入解析JavaNIO在高并发场景下的性能优化实践指南》随着互联网业务不断演进,对高并发、低延时网络服务的需求日益增长,本文将深入解析JavaNIO在高并发场景下的性能优化方法,希望对大家有所帮助... 目录简介一、技术背景与应用场景二、核心原理深入分析2.1 Selector多路复用2.2 Buffer

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基