SJTU-SE ICS lab2(bombing..)

2023-10-29 12:10
文章标签 se .. lab2 ics sjtu bombing

本文主要是介绍SJTU-SE ICS lab2(bombing..),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

利用GDB以及objdump做ICS lab2(defuse bomb)的一些心得

这个lab我在网络上也看到了很多前辈的分析,主要是针对于对汇编代码的解读,这些固然是极为好的。但是有时候反汇编的工作太过于冗杂,所以这个时候如果可以巧妙地利用gdb去做一些工作的话,对于完成这个lab的效率可以有很大的提升。这篇博客主要由这个点出发,记录一些我的经验。

这个lab主要是一个拆弹工作,简单地说就是用gdb以及objdump生成的汇编代码去分析程序需要你做出什么样子的输入。
在这里主要需要用到gdb的两个指令,break和x。如果不了解用法的话请及时查阅。
那么这里用我个人的bomb里的phase_6举一个例子。

首先要声明的是,如果你想要对汇编有更深入的理解,我不推荐你用我做题的这种方法。我的方法注重的是“结果”,如果你想要深入理解“过程”,我推荐你仔细余阅读汇编代码,尽量写出相应的c代码,然后再寻求答案。

这里贴一下phase_6的汇编代码。

phase_6
分析的时候要尽量抓住重点,很明显,这里的重点是这个叫做fun6的函数。那么这里势必需要去看fun6的汇编代码,其中还要注意到fun6的参数储存在rdi里,是一个与用户输入无关的值:0x203750。
fun6_1
fun6_2
由于智力太低的原因,我并不能直接看懂这个汇编代码——也就是说,我不能把他翻译成c代码。所以如果我想看懂这些代码的话,我必须逐行理解这个代码,并且自行模拟这个代码的过程。我昨晚尝试这么做,前前后后花了数不清的时间也不能做出来。

然后今天上午我想到,这个函数有一个很大的特点——他的输入与用户输入无关,是一个固定的地址值。然后我去查看了这个地址值,发现是一些精心设计好的数据,可以看出来也是与用户无关的。以上这些话的结论是,这个函数输出的势必是一个固定的值。

那么这么一来就很简单了,我们只需要在gdb里设置合理的断点,直接查看该函数的返回值就可以了。如此一来,就省去了理解这个函数所需的功夫。

通过继续观察phase_6,发现该函数最后决定对错的是1605处的cmp语句。在这句话之前三行,被操作的值是rax和edx。而我们输入的值是strtol的返回值,被储存在rbx里。也就是说,这些操作数和我们的输入也没有关系。那么事请就更加简单了,我们继续在1605处设置一个断点,直接查看rax的值,然后再输入一个正确的和rax一摸一样的答案就可以了。

这篇关于SJTU-SE ICS lab2(bombing..)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

JavaSE-易错题集-002

1. 下面有关java基本类型的默认值和取值范围,说法错误的是? A 字节型的类型默认值是0,取值范围是-2^7—2^7-1 B boolean类型默认值是false,取值范围是true\false C 字符型类型默认是0,取值范围是-2^15 —2^15-1 D long类型默认是0,取值范围是-2^63—2^63-1 答案:C 题解:注意字符型(char) char 占16位,

JavaSE(十三)——函数式编程(Lambda表达式、方法引用、Stream流)

函数式编程 函数式编程 是 Java 8 引入的一个重要特性,它允许开发者以函数作为一等公民(first-class citizens)的方式编程,即函数可以作为参数传递给其他函数,也可以作为返回值。 这极大地提高了代码的可读性、可维护性和复用性。函数式编程的核心概念包括高阶函数、Lambda 表达式、函数式接口、流(Streams)和 Optional 类等。 函数式编程的核心是Lambda

O(n)时间内对[0..n^-1]之间的n个数排序

题目 如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序 思路 把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序 代码 #include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A,

二、Maven工程的创建--JavaSEJavaEE

1、idea创建Maven JavaSE工程:  2、idea创建Maven JavaEE工程:   (1)手动创建 (2)插件方式创建 在idea里安装插件JBLJavaToWeb; 选择需要生成的项目文件后,右击: 项目的webapp文件夹出现小蓝点,代表成功。

servlet用反射代替if..else

String methodName = request.getParameter("method"); Method method = this.getClass().getDeclaredMethod(methodName,HttpServletRequest.class, HttpServletResponse.class); method.invoke(this, request, re

【JavaSE基础】Java 基础知识

Java 转义字符 Java 常用的转义字符 在控制台,输入 tab 键,可以实现命令补全 转义字符含义作用\t制表符一个制表位,实现对齐的功能\n :换行符\n换行符一个换行符\r回车符一个回车键 System.out.println(“韩顺平教育\r 北京”);"双引号一个"’单引号一个'\反斜杠一个\ Java 转义字符的使用 //演示转义字符的使用public class

JavaSE-易错题集-001

1. AccessViolationException异常触发后,下列程序的输出结果为(      ) 1 2 3 4 5 6 7 8 9 10 11 12 13 static void Main(string[] args)   {       try       {           throw new AccessViolationException();           Con

面试—JavaSE

目录 面向对象三大特征 重载和重写的区别 final和static修饰符 接口和抽象类的区别 面向对象三大特征 封装、继承、多态 封装 将对象的属性和方法放入到一个类中,通过访问修饰符来控制对类的访问权限 继承 继承是指子类可以继承父类的一些属性和方法 子类继承后需要重写虚方法表(非private,非static,非final)中的方法 多态 同类型的对象表现出的不

力士乐驱动主板CSB01.1N-SE-ENS-NNN-NN-S-N-FW

力士乐驱动主板CSB01.1N-SE-ENS-NNN-NN-S-N-FW ‌力士乐驱动器的使用说明主要涉及软件安装、参数配置、PID调节等方面。‌  ‌软件安装‌:安装过程涉及多个步骤,首先需要打开安装文件夹中的CD1,双击setup.exe进行安装。在安装过程中,需要选择语言、接受许可协议、输入安装名称、选择安装目录等。整个安装过程可能需要10多分钟,取决于电脑性能。安装完成后,需要重启计算