西工大网络空间安全学院计算机系统基础实验二(phase_3,phase_4,phase_5)

大家千万不要着急,不要慌张,即使自己并不了解多少汇编代码的知识,即使自己计基课上的基础知识学的并不扎实,也都不要紧,因为这次计基实验考察的重点并不是基础知识,而是对gdb工具的掌握,以及心细的程度,所以不要害怕,你只管往前走,走到地方了你就知道该怎么做了。

既然我们已经破解了phase_1和phase_2,那么我们不妨将断点打在phase_3上。然后使用命令"r"执行bomb可执行文件,接着输入已破译的phase_1和phase_2答案字符串,接着随便输入"111"作为答案字符串,然后一路"ni",直到 图1:通过'%d %d',我们似乎了解到了什么 所示。既然在phase_2中,我们已经知道了,__isoc99_sscanf@plt这个函数,会将(%esp)的字符串按照(%esp+4)的格式进行读取,也就是将'111'按照'%d %d'进行读取,那么我们不妨退出gdb,重新随便输入'8 9'作为phase_3的答案字符串,然后一路"ni"到当前这个位置,如 图2:退出gdb,重新随便输入'8 9'作为phase_3的答案字符串,然后一路"ni"到当前这个位置 所示

图1:通过'%d %d',我们似乎了解到了什么

图2:退出gdb,重新随便输入'8 9'作为phase_3的答案字符串,然后一路"ni"到当前这个位置

既然我们随便输入的phase_3的答案字符串是'8 9',能够顺利按照'%d %d'的形式进行读取,那么我们可以大胆的"ni",一直到 图3:判断第一个整数 所示。我们发现,如果(%esp+4)的值大于7,也就是我们输入的第一个整数的值大于7,那么程序就会跳到第<phase_3+224>行,可是第<phase_3+224>行就是引爆炸弹!!!所以我们不能那样子做,所以我们输入的第一个整数应该小于等于7。因此,重新输入phase_3的答案字符串为'7 8',然后重新启动gdb,一路"ni"到现在的位置,如 图4:重新输入phase_3的答案字符串为'7 8',然后重新启动gdb,一路"ni"到现在的位置 所示。

图3:判断第一个整数

图4:重新输入phase_3的答案字符串为'7 8',然后重新启动gdb,一路"ni"到现在的位置

接着继续"ni"下去,直到 图5:第二次判断第一个整数 所示。第一个整数的值同时还应该小于5,所以我们重新输入phase_3的答案字符串为'4 8',然后重新启动gdb,一路"ni"到现在的位置,如 图6:重新输入phase_3的答案字符串为'4 8',然后重新启动gdb,一路"ni"到现在的位置 所示。

图5:第二次判断第一个整数

 

图6:重新输入phase_3的答案字符串为'4 8',然后重新启动gdb,一路"ni"到现在的位置

接着继续"ni",直到 图7: 判断第二个整数 所示。

图7: 判断第二个整数

在这里,我们必须要跳到第<phase_3+157>行去,否则程序顺序执行的话,就会执行到第<phase_3+152>行,就会引爆炸弹。那么该如何跳到第<phase_3+157>行去呢?应该让(%esp+8)的值与%eax的值相等,而(%esp+8)的值为8,也就是我们输入的第二个整数,%eax的值为0,所以我们不妨重新输入"4 0"作为phase_3的答案字符串,然后一路"ni"到当前位置,如 图8:重新输入"4 0"作为phase_3的答案字符串,然后一路"ni"到当前位置 所示。

图8:重新输入"4 0"作为phase_3的答案字符串,然后一路"ni"到当前位置

接着继续"ni"下去,当出现如 图9:成功攻破phase_3 所示的界面时,就证明我们成功找到了phase_3的答案字符串啦!到现在为止,我们找出的答案字符串为:

I turned the moon into something I call a Death Star.
0 1 1 2 3 5
4 0

图9:成功攻破phase_3

接着phase_4,我们将断点打在phase_4上,然后随便输入'111'作为答案字符串,观察此时的gdb,如 图10:开始攻破phase_4 所示。

图10:开始攻破phase_4

接着一路"ni"下去,直到如 图11:仍然让我们输入两个整数 所示的情况出现,我们仿照着前面的做法,重新输入"4 0"作为phase_4的答案字符串,然后再"ni"到当前位置,如 图12:照着前面的做法,重新输入"4 0"作为phase_4的答案字符串,然后再"ni"到当前位置 所示。

图11:仍然让我们输入两个整数

图12:照着前面的做法,重新输入"4 0"作为phase_4的答案字符串,然后再"ni"到当前位置

接着一路"ni"下去,直到如 图13:当第一个整数小于等于14时,不会引爆炸弹 所示的情况出现时,停下来分析。在这里其实隐藏了第<phase_4+72>行,而这一行就是引爆炸弹,意思是我们输入的第一个整数必须小于等于14,否则就会引爆炸弹。但是考虑到我们输入的第一个整数是'4',因为不会在这里便立刻就引爆炸弹,所以我们可以继续"ni"下去,直到 图14:调用func4函数 ,func4函数是干什么用的呢?我们也没有心思去研究func4的功能,所以反复尝试第一个整数,尝试1、2、3、4、5、6、8、9、10、11、12、13、14,发现仅当第一个整数为13时才能通过,接着第二个整数为31时才能通过。最终成功拆弹,如 图15:成功拆除phase_4 所示。而我们的phase_4的答案字符串即为"13 31"。

图13:当第一个整数小于等于14时,不会引爆炸弹

图14:调用func4函数

图15:成功拆除phase_4

至此,我们获得的所有答案为:

I turned the moon into something I call a Death Star.
0 1 1 2 3 5
4 0

13 31

 

接着phase_5。我们自己尝试过几次之后,得到了如下的思路:phase_5的要求是什么呢?phase_5要求我们输入六个字符,比如我们输入的是"abcdef”,因为'a'的ASCII码值的16进制表示为0x61,接着让0x61&0x0F,接着将这个结果乘以4加到0x565581e0之上,也就是0x565581e0+0x4=0x565581e4,然后在内存中找到地址为0x565581e4的内容,将这个内容加到sum上,而0x565581e4的内容为0x0000000a,所以sum=0xa;接着第二个字符是'b',因为'b'的ASCII码值的16进制表示为0x62,接着让0x62&0x0F,接着将这个结果乘以4加到0x565581e0之上,也就是0x565581e0+0x8=0x565581e8,然后在内存中找到地址为0x565581e8的内容,将这个内容加到sum上,而0x565581e8的内容为0x00000006,所以sum=0xa+0x6=0x10... ...重复处理'c','d','e','f',得到了sum的值。而最终能够成功拆弹的要求是,sum的值应该为41D,那么如何才能得到41D呢?可以8+8+8+8+8+1,而哪个内存地址中的内容为8,哪个内存地址中的内容又为1呢?如 图16:不同内存地址中的数 所示。发现0x56558214中为8,0x565581ec中为1,而0x56558214-0x565581e0=0x34,0x34/0x4=0xD,而'm'的ASCII值就是0x6D,所以前5个字符可以选择为'm',而0x565581ec-0x565581e0=0xc,0xc/0x4=0x3,而'c'的ASCII值就是0x63,所以最后1个字符可以选择为'c'。因此针对phase_5,我们可以构造字符串'mmmmmc'。

pwndbg> x 0x565581e0
0x565581e0 <array.3068>:    0x00000002
pwndbg> x 0x565581e4
0x565581e4 <array.3068+4>:    0x0000000a
pwndbg> x 0x565581e8
0x565581e8 <array.3068+8>:    0x00000006
pwndbg> x 0x565581ec
0x565581ec <array.3068+12>:    0x00000001
pwndbg> x 0x565581f0
0x565581f0 <array.3068+16>:    0x0000000c
pwndbg> x 0x565581f4
0x565581f4 <array.3068+20>:    0x00000010
pwndbg> x 0x565581f8
0x565581f8 <array.3068+24>:    0x00000009
pwndbg> x 0x565581fc
0x565581fc <array.3068+28>:    0x00000003
pwndbg> x 0x56558200
0x56558200 <array.3068+32>:    0x00000004
pwndbg> x 0x56558204
0x56558204 <array.3068+36>:    0x00000007
pwndbg> x 0x56558208
0x56558208 <array.3068+40>:    0x0000000e
pwndbg> x 0x5655820c
0x5655820c <array.3068+44>:    0x00000005
pwndbg> x 0x56558210
0x56558210 <array.3068+48>:    0x0000000b
pwndbg> x 0x56558214
0x56558214 <array.3068+52>:    0x00000008
pwndbg> x 0x56558218
0x56558218 <array.3068+56>:    0x0000000f
pwndbg> x 0x5655821c
0x5655821c <array.3068+60>:    0x0000000d

图16:不同内存地址中的数

至此,我们得到的答案为:

I turned the moon into something I call a Death Star.
0 1 1 2 3 5
4 0
13 31
mmmmmc

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

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

相关文章

基于.NET Core + Quartz.NET+ Vue + IView开箱即用的定时任务UI

前言 定时任务调度应该是平时业务开发中比较常见的需求&#xff0c;比如说微信文章定时发布、定时更新某一个业务状态、定时删除一些冗余数据等等。今天给大家推荐一个基于.NET Core Quartz.NET Vue IView开箱即用的定时任务UI&#xff08;不依赖数据库,只需在界面做简单配…

Spring Boot学习随笔- 集成JSP模板(配置视图解析器)、整合Mybatis(@MapperScan注解的使用)

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第五章、JSP模板集成 5.1 引入JSP依赖 <!--引入jsp解析依赖--> <!--C标签库--> <dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version&…

第二十一章网络通信

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmissio…

java系列-LinkedHashMap

1.插入新节点时&#xff0c;会将该节点加到链表尾部 public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{/*** The head (eldest) of the doubly linked list.*/transient LinkedHashMapEntry<K,V> head;/*** The tail (young…

【小红书运营指南2】小红书自律标签的达人分解

小红书标签的达人分解 写在最前面11.27初步想法达人分析 标签拆解&#xff08;速览版&#xff09;分析应用 思路 相关标签拆解&#xff08;详细版&#xff09;11、职场-职场干货 文化薯&#xff08;创业&#xff0c;也是专注知识付费&#xff0c;可以对标学习&#xff09;笔记画…

用modelbox server启动流程图,暴露Restful接口

背景 假设你已经搭建了modelbox开发容器&#xff0c;能够使用webUI构建流程图。如果没有请参考昇腾npu上构建modelbox webUI开发容器教程。 现在&#xff0c;本文会说明&#xff0c;如何在终端用命令的方式将流程图暴露为服务&#xff0c;并能够在本地用postman访问。 本文参…

华为OD机试三(完全二叉树部分后续遍历、猜密码、五子棋谜)

1. 完全二叉树部分后续遍历 题目表述&#xff1a;输入&#xff1a; 1 2 3 4 5 6 7 输出&#xff1a; 2 3 1 示例代码&#xff1a; # 测试数据 test_data [1,2,3,4,5,6,7] # 找出非叶子节点 new_list [] for i in test_data:left 2 * iright left 1if left in test_data…

使用 Webshell 访问 SQL Server 主机并利用 SSRS

RDS SQL Server提供Webshell功能&#xff0c;用户可以通过Web界面登录RDS SQL Server 实例的操作系统。通过Webshell&#xff0c;用户可以在RDS SQL Server实例上执行命令、上传和下载文件以及执行各种操作。Webshell 提供了一种方便高效的远程管理方法&#xff0c;尤其是在 SS…

如何使用nacos进行配置管理以及代码集成

首先需要在maven的pom文件中引入nacos-config依赖 <!--nacos配置管理依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency> 在项目中添加boo…

Python 全栈体系【四阶】(四)

第四章 机器学习 一、人工智能概述 1. 什么是人工智能 人工智能&#xff08;Artificial Intelligence&#xff09;是计算机科学的一个分支学科&#xff0c;主要研究用计算机模拟人的思考方式和行为方式&#xff0c;从而在某些领域代替人进行工作。 2. 人工智能的学科体系 …

输出网络结构图,mmdetection

控制台输入&#xff1a;python tools/train.py /home/yuan3080/桌面/detection_paper_6/mmdetection-master1/mmdetection-master_yanhuo/work_dirs/lad_r50_paa_r101_fpn_coco_1x/lad_r50_a_r101_fpn_coco_1x.py 这个是输出方法里面的&#xff0c;不是原始方法。 如下所示&a…

分层自动化测试的实战思考!

自动化测试的分层模型 自动化测试的分层模型&#xff0c;我们应该已经很熟悉了&#xff0c;按照分层测试理念&#xff0c;自动化测试的投入产出应该是一个金字塔模型。越是向下&#xff0c;投入/产出比就越高&#xff0c;但开展的难易程度/成本和技术要求就越高&#xff0c;但…

附录C 流水线:基础与中级概念

1. 引言 1.1 什么是流水线&#xff1f; 流水线爱是一种将多条指令重叠执行的实现技术&#xff0c;它利用了一条指令所需的多个操作之间的并行性。&#xff08;指令操作的非原子性和指令类型的多样性&#xff09; 在计算流水线中&#xff0c;每个步骤完成指令的一部分&#x…

Leetcode143 重排链表

重排链表 题解1 线性表 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值&#xff0c;而是需要实际…

现代物流系统的分析与设计

目 录 引言 3一、系统分析 4 &#xff08;一&#xff09;需求分析 4 &#xff08;二&#xff09;可行性分析 4 二、 总体设计 4 &#xff08;一&#xff09;项目规划 4 &#xff08;二&#xff09;系统功能结构图 5 三、详细设计 6 &#xff08;一&#xff09;系统登录设计 6 …

【技术分享】企业网必不可少的NAT技术

NAT是一种地址转换技术&#xff0c;它可以将IP数据报文头中的IP地址转换为另一个IP地址&#xff0c;并通过转换端口号达到地址重用的目的。NAT作为一种缓解IPv4公网地址枯竭的过渡技术&#xff0c;由于实现简单&#xff0c;得到了广泛应用。 NAT解决了什么问题&#xff1f; 随…

【lesson11】表的约束(4)

文章目录 表的约束的介绍唯一键约束测试建表插入测试建表插入测试建表插入测试修改表插入测试 表的约束的介绍 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保…

关于学习计算机的心得与体会

也是隔了一周没有发文了&#xff0c;最近一直在准备期末考试&#xff0c;后来想了很久&#xff0c;学了这么久的计算机&#xff0c;这当中有些收获和失去想和各位正在和我一样在学习计算机的路上的老铁分享一下&#xff0c;希望可以作为你们碰到困难时的良药。先叠个甲&#xf…

Appium 自动化自学篇 —— 初识Appium自动化!

Appium 简介 随着移动终端的普及&#xff0c;手机应用越来越多&#xff0c;也越来越重要。而作为测试 的我们也要与时俱进&#xff0c;努力学习手机 App 的相关测试&#xff0c;文章将介绍手机自动化测试框架 Appium 。 那究竟什么是 Appium 呢? 接下来我们一起来学习PythonS…

分布式环境认证和授权-基于springboot+JWT+拦截器实现-实操+源码下载

1、功能概述&#xff1f; 1、当用户登录的时候&#xff0c;将用户的信息通过JWT进行加密和签名&#xff0c;并将JWT产生了token信息保存到当前浏览器的localStoragee中,即本地存储中。 2、当用户登录成功后&#xff0c;访问其他资源的时候&#xff0c;程序从localStorage中获…