VM虚拟机逆向---羊城杯2023 vm_wo复现【详解】

2023-11-08 10:28

本文主要是介绍VM虚拟机逆向---羊城杯2023 vm_wo复现【详解】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 题目分析
  • 还原汇编
  • exp
  • 后言

前言

兜兜转转终于回到这里了。之前复现了羊城杯较简单点的三题,到这一题vm卡住了,刷了好几道,终于搞定了。

题目分析

在这里插入图片描述

第一次遇到Mac os的题目,幸好还可以做。

在这里插入图片描述

opcode 和 指令操作
在这里插入图片描述

密文:
在这里插入图片描述

opcode先提取出来,得到:

opcode = [26, 0, 3, 25, 1, 1, 13, 2, 7, 24, 1, 2, 1, 0, 3, 26, 0, 3, 25,1, 2, 13, 2, 6, 24, 1, 2, 1, 0, 4, 26, 0, 3, 25, 1, 3, 13, 2, 5,24, 1, 2, 1, 0, 5, 26, 0, 3, 25, 1, 4, 13, 2, 4, 24, 1, 2, 1, 0, 6]

在这里插入图片描述
注意这里是,后面的八位拼接上去会把前面的最后一个给覆盖掉。同时数据在内存中是小端序存储,因此还需要逆序一下。

查个重。得到:

[26, 0, 3, 25, 1, 13, 2, 7, 24, 6, 4, 5]

在这里插入图片描述

一共26条指令,真的多,但是因为我们opcode很少,可以只还原一部分就OK了。

还原汇编

opcode = [26, 0, 3, 25, 1, 1, 13, 2, 7, 24, 1, 2, 1, 0, 3, 26, 0, 3, 25,1, 2, 13, 2, 6, 24, 1, 2, 1, 0, 4, 26, 0, 3, 25, 1, 3, 13, 2, 5,24, 1, 2, 1, 0, 5, 26, 0, 3, 25, 1, 4, 13, 2, 4, 24, 1, 2, 1, 0, 6]
# [26, 0, 3, 25, 1, 13, 2, 7, 24, 6, 4, 5]i = 0
while opcode[i]:match opcode[i]:case 0:print(f"{i} swap reg%d reg%d" % (opcode[i+1],opcode[i+2]))case 1:print(f"{i} xor reg%d reg%d" % (opcode[i+1],opcode[i+2]))case 2:print(f"{i} add reg%d %d" % (opcode[i+1],opcode[i+2]))case 3:print(f"{i} add reg%d reg%d" % (opcode[i+1],opcode[i+2]))case 4:print(f"{i} sub reg%d %d" % (opcode[i+1],opcode[i+2]))case 5:print(f"{i} sub reg%d reg%d" % (opcode[i+1],opcode[i+2]))case 6:print(f"{i} mul reg%d %d" % (opcode[i+1],opcode[i+2]))case 7:print(f"{i} mul reg%d reg%d" % (opcode[i+1],opcode[i+2]))case 13:print(f"{i} mov reg%d reg0<<%d" % (opcode[i+1],opcode[i+2]))case 24:print(f"{i} reg0 = reg2 | reg1")case 25:print(f"{i} mov reg%d reg0>>%d" % (opcode[i+1],opcode[i+2]))case 26:print(f"{i} mov reg%d %d" % (opcode[i+1],opcode[i+2]))i += 3

运行后打印的结果1:

0 mov reg0 3
3 mov reg1 reg0>>1
6 mov reg2 reg0<<7
9 reg0 = reg2 | reg1
12 xor reg0 reg3
15 mov reg0 3
18 mov reg1 reg0>>2
21 mov reg2 reg0<<6
24 reg0 = reg2 | reg1
27 xor reg0 reg4
30 mov reg0 3
33 mov reg1 reg0>>3
36 mov reg2 reg0<<5
39 reg0 = reg2 | reg1
42 xor reg0 reg5
45 mov reg0 3
48 mov reg1 reg0>>4
51 mov reg2 reg0<<4
54 reg0 = reg2 | reg1
57 xor reg0 reg6

这里打印的指令蛮少的,而且也没有和密文比较的地方,推测是单字符加密,解密的话就逆向就好了。

加密逻辑写出来大概就是

	s = (s >> 1 |  s << 7) & 0xFFs = s ^ reg3s = (s >> 2 | s << 6) & 0xFFs = s ^ reg4s = (s >> 3 | s << 5) & 0xFFs = s ^ reg5s = (s >> 4 | s << 4) & 0xFFs = s ^ reg6

通过内存可以发现,reg3 到 reg6 就是
在这里插入图片描述
在这里插入图片描述

exp

enc = [0xDF, 0xD5, 0xF1, 0xD1, 0xFF, 0xDB, 0xA1, 0xA5, 0x89, 0xBD, 0xE9, 0x95, 0xB3, 0x9D, 0xE9, 0xB3, 0x85, 0x99, 0x87,0xBF, 0xE9, 0xB1, 0x89, 0xE9, 0x91, 0x89, 0x89, 0x8F, 0xAD]
key = 0xBEEDBEEF.to_bytes(4, 'little')def decode(s):s = s ^ key[3]s = (s << 4 | s >> 4) & 0xFFs = s ^ key[2]s = (s << 3 | s >> 5) & 0xFFs = s ^ key[1]s = (s << 2 | s >> 6) & 0xFFs = s ^ key[0]s = (s << 1 | s >> 7) & 0xFFreturn sflag = []
for i in enc:i = ((i >> 3) | (i << 5) & 0xFF)flag.append(decode(i))
print(bytes(flag))
# b'DASCTF{you_are_right_so_cool}'

后言

前面练的。
VM基础知识和EzMachine复现
HGAME 2023 week4vm复现
GWCTF 2019babyvm 复现
NCTF 2018wcyvm 复现

这篇关于VM虚拟机逆向---羊城杯2023 vm_wo复现【详解】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1