计算机系统实验-BombLab

news2024/11/28 6:51:21

一.实验题目及目的

1.实验题目

        程序运行在linux环境中。程序运行中有6个关卡(6个phase),每个phase需要用户在终端上输入特定的字符或者数字才能通关,否则将会引爆炸弹。需要通过分析汇编代码,使用gdb调试等方式找到正确的字符。

2.实验目的

        熟悉汇编代码的分析方法,c程序的机器级表达以及控制,过程等相关知识,熟悉gdb调试的方法及过程。

二.实验内容

1.实验过程

        首先观察主函数:

        每一个炸弹的程序部分都相同,读入字符串,调用phase函数,如果结果正确将继续进行下一个字符串输入,否则炸弹爆炸。为了方便分析,将bomb文件反汇编的代码保存至txt文件,并使用gdb调试程序,找到程序设定的正确的字符串。

(1)phase1

        找到汇编代码对应主函数中调用phase_1的位置,在调用read_line读取字符串与调用phase_1之间有一条mov指令,将eax寄存器中的值转移到esp寄存器保存的地址当中,这个值应该为输入字符串的地址

        可以看到phase_1中调用了strings_not_equal,判断输入的字符是否与正确的字符相等,并使用test指令测试结果,字符串不正确(eax存放的值不为0)将调用explode_bomb爆炸。在调用strings_not_equal前有三条mov指令,包括一个转移立即数到esp+4的mov指令,这个立即数可能是正确字符串的地址。

        使用gdb查看以这个立即数为地址所保存的内容,为一个字符串“Verbosity leads to unclear, inarticulate things.”,输入这个字符串,phase_1通过。

(2)phase_2

        分析phase_2的汇编代码。phase_2中调用了read_six_number,提示答案应该为6个数字。首先将esp+24所指向的位置保存的数据与1进行比较,不相同则炸弹爆炸。相同将esp+28赋值给ebx,esp+48赋值给esi。接下来将esp-4所指向位置的数乘2与ebx比较,比较成功后将ebx+4,并将ebx与esi比较,作为一个循环。开始比较时ebx与esi相差20,5次循环刚好判断后5个数是否正确,而每个数正确与否又是与上一个数乘2进行比较。根据这部分逻辑可以得出,这段代码先判断数字第一位是否是1,接下来判断每一位是否是上一位的2倍,即答案的数字应该为1 2 4 8 16 32,输入这6个数字,phase_2通过。

(3)phase_3

        分析phase_3的汇编代码,phase_3中是通过调用sscanf()读取格式化字符串的。注意到在调用sscanf()前有一条操作将立即数804a2ef指向的数据保存到esp+4的位置,gdb调试将断点设置在phase_3,查看该立即数指向的数据,得到一个字符串,推断出该字符串是sscanf()的参数,由此可知phase_3的答案为两个整数。

        继续分析phase_3,调用sscanf()后将eax寄存器保存的值与1比较,小于等于1则爆炸。eax中保存的值为sscanf返回的成功匹配的个数,说明输入的数个数小于等于1将会直接爆炸。

        接下来将esp+24处的值与7进行比较,如果大于7将爆炸。可以判断esp+24处的值为第一个输入的数字,这个数字必须小于7(且大于等于0)。接下来的跳转指令为间接跳转指令,将跳转到的地址与这个数字有关,打开gdb找到当这个数字为0时将要跳转到的位置,即跳转表的地址,为0x8048c4c。

        先假设第一个数字为0进行跳转,分析汇编代码进行的操作。主要是将第一个数字进行一些加减操作,再与第二个数比较,相等即可通过。计算后得到当第一个数为0时,第二个数应该为-1235。

        输入0 -1235,phase_3通过。

        注意到在执行完对第一个数的加减操作后将原来的第一个数与5比较,若大于5则爆炸,故第一个数的实际范围是0-5。分析跳转表中的其他情况,当第一个数字为1,2,3,4,5时,对应的第二个数字分别为-1346,-476,-761,0,-761,经测试这些答案同样可通过phase_3。

        故该题共6个答案:0 -1235;1 -1346;2 -476;3 -761;4 0;5 -761。

(4)phase_4

        分析汇编代码,phase_4同样使用调用了sscanf,且参数的地址仍然是0x804a2ef,即参数为“%d %d”,答案也是两个整数。根据算数指令和跳转指令,第二个数大于4将调用explode_bomb,故第二个数应该小于等于4(且大于等于2)。接下来将第二个数移到esp+4的位置,将esp指向的位置赋值9,调用func4。如果第二个数与func4返回的结果相同,则phase_4通过。

        接下来分析func4的汇编代码,func4栈帧的情况如下:

        设func4的两个参数为A,B其中A是输入的第二个数,发现func4存在递归调用的情况,且有两次递归调用:

        对应C代码的逻辑为:

        计算出phase_4的答案为176 2;264 3;352 4;

(5)phase_5

        分析phase_5的汇编代码。首先调用string_length得到输入的字符串长度,并与6比较,不相等则爆炸,phase_5答案为长度为6的字符串。

        接下来的部分是一个6次的循环计算一个累加值,累加值是以每个字符的ASCII码保留后4位+一个立即数0x804a1a0为地址处的值,最终结果等于0x3f(63)时,phase_5通过。gdb中查看这个立即数地址开头的表:

   将63分解为16+16+16+12+2+1,则六个ASCII码的后四位分别应该为0101,0101,0101,0100,0000,0011,对照ASCII码表查找符合条件的一组字符EEED@C,输入后phase_4通过,存在其他可能的答案且字符顺序不限。

(6)phase_6

        分析phase_6的汇编代码。phase_6中调用了read_six_number,答案为6个数字。根据跳转指令跳转到的位置,读取数字后进入了一个双层循环。

        外层循环当esi值为6时结束,每次比较前esi+1,即外层循环6次,对应6个答案的数字,每次将数字取出-1与5比较,>5爆炸,数字的范围为1-6。内层循环则是每一个数与下标大的数的比较,相等则爆炸,所以6个数均不相同,可以得出本题答案是123456的一种排列。

        接下来的部分仍然包含循环,且出现了一个立即数地址,gdb查看:

        这个地址保存的是一个节点数据,节点包含的数据类型还不明确,继续分析汇编代码,汇编代码中有一条指令mov 0x8(%ebx),%ebx,将ebx保存的值+8为地址取数据后保存到ebx寄存器,这条指令会循环执行多次,这表明ebx保存的值+8处的数据仍是一个地址。将node1+8处的数据作为地址查看数据:

        找到了node2,此时可知节点中包含一个指针数据类型,指向下一个节点。这说明程序中存在一个链表,继续分析汇编代码:

        这次的循环仍然循环6次,取出每个数字,找到数字对应的节点的地址,将其存入内存中,存放的地址是按顺序由低到高的。例如输入数字543216,在内存中由低到高存放着节点5.4.3.2.1.6的地址。

        继续分析下一部分,下一部分中首先包含一个循环,循环中的操作修改了每个节点的下一节点地址,将第二个数字对应节点的地址设置为第一个数字对应节点的下一节点,即对于输入数字543216,将会把原链表的节点修改为node5->node4->node3->node2->node1->node6,按照输入的数字调整了链表的顺序。

        接下来又是一个5次的循环,其中ebx保存的是修改后第一个节点的地址,第一次循环进行的操作如下图:

        可以得出循环的操作是判断每个节点的值都必须大于下一个节点。

        接下来gdb查看原链表每一个节点的值:

  node+4的位置应该是节点编号,比较node处的值,node2>node6>node5>node4>node1>node3,按照要求重排后每个节点值大于下一节点值,输入2 6 5 4 1 3,phase_6通过。

(7)secret_phase

      在汇编代码中可以看到一个secret_phase的函数,在phase_6通过后没有出现,查找secret_phase,在phase_defused中出现了secret_phase调用,且上方调用了一次strings_not_equal,与一个指定的字符串相等将进入secret_phase,上方还有一些立即数,分别对应的是正确进入secret_phase的提示和一个输入格式,这个格式推测为进入secret_phase_的方式,“%d %d %s”,与三四关的输入格式类似,在第四关结果后输入DrEvil,phase_6结束后正确进入了secret_phase。

      找到了进入secret_phase的方法,接下来分析secret_phase的代码。首先调用read_line读一行,接下来调用strtol将字符转换为长整型,参数为a,即转换为10进制数,输入的数字本身。

      接下来将这个数字-1与1000比较,需要小于等于1000才不会触发爆炸,因此输入的数是一个1-1000的数。接下来将这个数作为参数(A),立即数0x804c088作为参数(B)传入并调用fun7。fun7的结果需要等于3.

      查看并分析fun7的代码,含有2次递归调用fun7:

      在递归调用时,取参数B+4和B+8处的数据作为参数传入了fun7,与phase_6类似,B+8和B+4的位置应该是一个地址,指向下一个节点,而node节点存储了两个节点的地址,与二叉树节点的形式相同,此处的操作可能是对一颗二叉树进行操作。根据汇编代码的操作,写出对应的c代码如下:

      找到第一次调用fun7传入的立即数地址,这个地址处为二叉树的根节点,gdb调试查看地址处的内容,构建出二叉树。使用graphviz做出了图,这是一颗二叉搜索树,节点值小于等于A时查找右节点,大于A时查找左节点。

      编写程序建立二叉树,调用fun7,查找使fun7返回值为3的值,得到99和107,输入通过。

2.实验结果

      phase_1: Verbosity leads to unclear, inarticulate things.

      phase_2:1 2 4 8 16 32

      phase_3: 0 -1235;1 -1346;2 -476;3 -761;4 0;5 -761,共6个答案

      phase_4: 176 2;264 3;352 4,共3个答案

      phase_5: EEED@C,有多种答案

      phase_6:2 6 5 4 1 3

      secret_phase:99 107,两个答案

三.实验总结

      六关+隐藏关对应了以下内容:

  • 常量字符串存储
  • 二叉树在汇编代码中的表示
  • 链表在汇编中代码的表示
  • 字符的ASCII码表示
  • 递归调用的过程
  • 跳转表
  • 循环

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

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

相关文章

oracle入门-19c 安装详细教程

我们知道学习一门技术,第一件事情就是搭建对应的环境。本教程将详细教大家如何安装oracle。 目录一、虚拟机创建二、挂载镜像、安装及系统配置三、 软件包传输四、数据库安装五、 图形化向导建库一、虚拟机创建 处理器数量根据自己的机器配置进行调整(4 …

Android IPC机制

本文首发于个人博客 “胖蔡叨叨叨”,更多相关信息可点击查看《Android IPC机制》​​​​​​​ IPC IPC(Inter Process Communication) 进程间通信,是指系统中运行的不同进程间的信息交互过程。Android IPC通常用于应用间、或同应用不同进程间的数据通…

3分钟读懂数据可视化如何帮助企业智慧管理,提升管理水平

随着大数据时代的到来,企业管理的决策越来越倚重数据指标,通过数据指标了解公司运作的情况,产品生产销售情况,收入与支出情况等等,更大的作用是对商业趋势预测提供了决策依据,使公司提前布局未来&#xff0…

Q-Automation:基于ATX的自动化测试管理软件

Softing Q-Automation是基于ATX的自动化测试管理软件,用于测试电子控制单元(ECU)。该软件支持诊断协议层测试和诊断功能测试,并且只需填写Excel表格,即可实现半自动化测试需求,从而缩短了用户的测试周期。同…

2022年终Java编程技术总结

目录 00 总体脑图 第一章、基础篇 01 计算机基础 ## 1.1 操作系统 1.1.1 基本知识 略 1.1.2 常见Linux命令 目录文件内容搜索系统类网络权限cdcp/scpvi/vimfind: find . -name xxkillnetstat -anchmodlsmvcatgrep: ps -efgrep xxlsof: lsof-i:portmkdirrmtailwhereistopp…

web前端期末大作业 ——电影主题介绍 你好,李焕英 ——html+css+javascript网页设计实例

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

Win11电脑蓝屏怎么办?Win11电脑蓝屏的修复方法

Win11电脑蓝屏怎么办?电脑蓝屏是最为常见的系统故障问题之一,当电脑出现蓝屏时一般分为可以开机以及无法开机的情况,针对这两种情况,下面小编分别准备了对应的解决方法,有需要的朋友们欢迎收藏慢慢看哦。 方法一&#…

家居类小红书达人投放总结,kol执行策略

在小红书平台上,许多品牌方都做了达人投放,但结果却反响平平,最后才发现是达人挑选出了问题,而发现这个问题的代价就是错失先机,也耗费大量成本来试错,今天为大家分享一下小红书达人投放总结以及超硬干货。…

多线程安全问题原理和4种解决办法

摘要:多线程访问了共享的数据,会产生线程安全问题。本文分享自华为云社区《多线程安全问题原理和解决办法Synchronized和ReentrantLock使用与区别》,作者:共饮一杯无。 线程安全问题概述 卖票问题分析 单窗口卖票一个窗口(单线程)卖100张票…

大数据学习 -- 利用Java API 将文件写入HDFS

利用API写入文件写入HDFS文件(1)将数据直接写入HDFS文件(2)将本地文件写入HDFS文件写入HDFS文件 类似于HDFS Shell里的hdfs dfs -put命令在net.zwh.hdfs包里创建WriteFileOnHDFS类 (1)将数据直接写入HDFS…

【记录】ChatGPT|注册流程、使用技巧与应用推荐(更新至2022年12月14日)

昨天,2022年12月13日,在下午和晚上,ChatGPT 就开始因为请求过多而写到一半就崩溃,出现network error,可见它的关注度确实是越来越可观了。 正好最近世界杯,有博客活动,干脆也总结一下 ChatGPT 目…

大白话讲懂word2vec原理和如何使用

前言 做自然语言处理(Natural Language Processing,NLP)这个领域的小伙伴们肯定对word2vec这个模型很熟悉了,它就是一种最为常见的文本表示的算法,是将文本数据转换成计算机能够运算的数字或者向量。在自然语言处理领…

【Docker】Dockerfile从概念介绍到快速上手编写案例实战

本期目录1. Dockerfile介绍1.1 Dockerfile的重要性1.2 构建三步骤2. Dockerfile构建过程2.1 Dockerfile内容基础2.2 Dockerfile执行流程2.3 总结3. Dockerfile常用保留字指令3.1 Dockerfile常用保留字一览3.2 保留字讲解4. 案例演示-自定义CentOS镜像4.1 前期准备4.2 编写Docke…

黑白图片怎样上色?教你如何给黑白照片上色

平时我们在网上浏览照片时,就会经常看到一些黑白色的照片。自从前段时间的复古风出现之后,很多小伙伴都会给自己拍摄的一些照片加上黑白滤镜,让原本彩色的照片变成了黑白色的,那大家知道黑白照片怎么变成彩色照片吗?今…

xxljob 自动清理日志的业务逻辑,以及涉及到的文件

目录 1 需求2 实现3 JobLogFileCleanThread1 需求 xxljob定时任务,会产生很多的日志文件,那么他是如何自动清除的呢? 2 实现 我们自己的项目集成了xxljob之后,会在yml里面有一个配置 ### 执行器日志文件保存天数 [选填] : 过期日志自动清理, # 限制值大于等于3时生效; …

物联网通信技术第7章 自组织网络(非常全,持续更新)

目录 知识点要求 7.1自组织网络概述 7.1.1 自组织网络的定义(掌握) 7.1.2 自组织网络的特点 (理解) 7.1.3 自组织网络的应用 7.2 自组织网络的体系结构(了解) 7.2.1 节点结构 7.2.2 自组织网络的网…

微信小程序开发—入门到跑路(二)

1、学习目标 知识点名称知识点内容难度系数要求程度模板语法数据绑定、事件绑定、条件渲染、列表渲染2星掌握WXSS样式WXSS3星掌握配置操作全局配置、TabBar配置、页面配置、3星掌握网络请求和案例网络数据请求、本地生活案例3星掌握文章目录1、学习目标2、模板语法2.1、数据绑…

AVS-代码路径说明

训练 1 config.py里面有backbone的路径,这里最好写在外面,写成绝对路径 不然每个算法都要放如下三个与训练模型,会很占地方vggishxxx.pth resnetxxx.pth pvt_v2_xxx.py AVS/AVSBenchmark1/avs_ms3/config.py 本来pretrained_backbones/xxx.pth文件在AVSB…

【C++】STL——list的常用接口

list的常用接口 文章目录list的常用接口一、list的介绍二、list的使用1.list的构造2.迭代器的使用2.1.begin和end2.2.rbegin和rend2.3.范围for2.4.迭代器的分类3.list的元素访问函数3.1.front和back4.list的容量操作函数4.1.empty4.2.size和max_size5.list修改的相关函数5.1.pu…

内卷起来,2023年外贸B2B企业怎么通过独立站吸引客户的注意

从国外疫情解封后,中国在2022年的最后一个月也解封了,我们努力了三年,现在不再查核酸、健康码,多家航空公司重新开通了国际航班。对许多外贸公司来说,是“外贸春天”的到来。那么即将到来的2023年,外贸B2B企…