NSSCTF Round#22 Reverse个人专项赛 WP

1. ezcrypt(史)

pyinstxtractor.py解包exe,然后pycdc反编译NSSCTF.pyc

得到的源码并不完整,但是重要的部分已经有了,就是一个blowfish加密

但是密钥是crypto.SomeEncode,这并不是字面意义的字符串,而是引用的其他文件

NSSCTF.exe_extracted可以找到可疑文件crypto.cpython.pyc

是一个魔改的TEA(这里出题逻辑有问题,按给的代码逻辑SomeEncode是v加密得到的,但实际上却要我们解密得到)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
    unsigned int enc[5] =
    {
        1396533857,
        0xCC8AE275,
        0x89FB8A63,
        940694833
        };
    unsigned int key[4] =
    {
        17,
        34,
        51,
        68
        };
    int i, j;
    for (i = 0; i < 4; i += 2)
    {
        unsigned int v0 = enc[i], v1 = enc[i + 1], sum = 0xC6EF3720;
        unsigned int delta = 0x9e3779b9;
        unsigned int k0 = key[0], k1 = key[1], k2 = key[2], k3 = key[3];
        for (j = 0; j < 32; j++)
        {
            v1 -= ((v0 << 3) + k2 ^ v0 + sum ^ (v0 >> 4) + k3 ^ 2310) & 0xFFFFFFFF;
            v0 -= ((v1 << 3) + k0 ^ v1 + sum ^ (v1 >> 4) + k1 ^ 596) & 0xFFFFFFFF;
            sum -= delta & 0xFFFFFFFF;
        }
        enc[i] = v0; enc[i + 1] = v1;
    }
    for (i = 0; i < 4; i++)
    {
        printf("%u ", enc[i]);
    }
    printf("%s", enc);//sNzEveRsjorPstce
    return 0;
}

这里有个每四位一个逆序(第三行就是ASCII转字符的意思),解出来手动改一下吧,就是 EzNssRevProjects

#ezcrypt wp
from Crypto.Cipher import Blowfish  
from Crypto.Util.Padding import unpad  
from Crypto.Random import get_random_bytes  
  
def decrypt_file(input_path, output_path, key):  
    with open(input_path, 'rb') as f:  
        # 读取整个文件内容,包括IV和密文  
        data = f.read()  
      
    # 分割IV和密文  
    iv = data[:Blowfish.block_size]  
    print(iv)
    ciphertext = data[Blowfish.block_size:]  
    print(ciphertext) 
    # 验证密钥长度  
    #if len(key) != Blowfish.key_size:  
    #    raise ValueError("Invalid key size for Blowfish. It must be exactly 8 bytes long.")  
      
    # 创建一个新的Blowfish cipher对象,并设置密钥和IV  
    cipher = Blowfish.new(key, Blowfish.MODE_CBC, iv=iv)  
     
    # 解密数据  
    plaintext = (cipher.decrypt(ciphertext), Blowfish.block_size)  
    print(plaintext[0])
    # 将解密后的数据写入输出文件  
    with open(output_path, 'wb') as f:  
        f.write(plaintext[0]) 

key = b'EzNssRevProjects'
input_path = 'D:\\下载\\CTF附件\\NSS22re\\output'
output_path = 'D:\\下载\\CTF附件\\NSS22re\\flag'

decrypt_file(input_path, output_path, key)

密钥解码得到一个二进制文件,IDA打开是个虚拟机(笑)

动调不出来(这里逻辑也莫名其妙,明明这个代码就应该能跑出flag,但实际上是要你把代码反过来写)

硬做,动调取出opcode,key

VM函数抄下来符号改一下,有个地方给的代码还不对,看汇编也是sub

这里应该是加号

#include<stdio.h>
__int64 __fastcall vm(unsigned char* a1, int* a2, int a3)
{
    __int64 result; // rax
    int i; // [rsp+1Ch] [rbp-8h]
    int v5; // [rsp+20h] [rbp-4h]

    for (i = 0; ; ++i)
    {
        result = i;
        if (i >= a3)
            break;
        v5 = i % 4;
        if (i % 4 == 3)
        {
            a1[i] -= a2[8] + a2[0];
        }
        else if (v5 <= 3)
        {
            if (v5 == 2)
            {
                a1[i] += a2[4] ^ a2[12];
            }
            else if (v5 <= 2)
            {
                if (v5)
                {
                    if (v5 == 1)
                    {
                        a1[i] ^= a2[0] - a2[8];
                    }

                }
                else
                {
                    a1[i] ^= a2[16] + a2[4];
                }
            }
        }
    }
    return result;
}
int main()
{
    unsigned char opcode[] =
    {
        0x37, 0x8D, 0x0F, 0xAB, 0x2D, 0x98, 0x37, 0xB5, 0x48, 0xA6,
        0x30, 0xDA, 0x0C, 0xED, 0x1B, 0xB8, 0x00, 0xE9, 0x24, 0x98,
        0x17, 0x81, 0xED, 0xB6, 0x26, 0x8C, 0x21, 0xDE, 0x04, 0xDE
        };
    int key[] =
    {
        0x23, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x45, 0x00,
        0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x67
        };

    vm(opcode, key, 30);
    printf("%s", opcode);//NSSCTF{M1xtru3_Py7h0n_1N_Rev}
    return 0;
}
2. EzHook

看起来只是异或,但是最后的字符有?很奇怪

联系题目实际上使用了Windows IAT Hook技术

动调试试,断在密文处

随你怎么输都是走左边

F8到MessageBoxA这里F7进去

进到另一个函数里,应该是hook注入的函数

这里是真正的提示分支,qword_7FF63596A090应当是真实的MessageBox

我们注意所有输入在78行xxtea加密之后,经过密文比较。又在83和88行解密

只要在解密之前把输入a2改成密文Str2即可

a2应该存在rcx寄存器里

每16个地址Change byte一次,把对应的密文填进去

然后跑到这里,a1点进去

3. 简简又单单

jadx打开

md还是个魔改XTEA

#include<stdio.h>
void xtea_decipher(unsigned int num_rounds, unsigned int v[2], unsigned int const key[4]) {
	unsigned int i;
	unsigned int v0 = v[0], v1 = v[1], delta = 0x9E3779B9, sum = delta * num_rounds;
	for (i = 0; i < num_rounds; i++) {
		v1 -= ((((v0 << 4) ^ (v0 >> 5)) + v0)^918) ^ (sum + key[(sum >> 11) & 3]);
		sum -= delta;
		v0 -= ((((v1 << 4) ^ (v1 >> 5)) + v1)^918) ^ (sum + key[sum & 3]);
	}
	v[0] = v0; v[1] = v1;
}
int main()
{
	unsigned int enusr[] = { 0x3c36eb49,0x81acb0c0,0xfac269ae,0xca5bf9ec }; // 密文
	unsigned int key[4] = { 0x12345678, 0x5678ABCD, 0x89ABCDEF, 0xCDEF1234 }; // 密钥

	for (int i = 0; i < 4; i += 2) {
		unsigned int tmp[2] = { 0 };
		tmp[0] = enusr[i];
		tmp[1] = enusr[i + 1];
		xtea_decipher(32, tmp, key);
		enusr[i] = tmp[0];
		enusr[i + 1] = tmp[1];
	}
	printf("%s", enusr);
	//NS5_R0Un6_z2_apK
	return 0;
}

密码看不到,因为在native层中

解压apk文件,找到so文件

可以搜到相应的函数

Java_com_example_nss_MainActivity_validatePassword内可以找到密文

应该是RC4加密过,但是脚本跑不出,又魔改了

Java_com_example_nss_MainActivity_encryptWithRC4看看

改成了128轮加密

加密密钥是用户名

#ez_APK wp
def rc4(data, key):
    S = list(range(128))
    j = 0
    out = []
 
    for i in range(128):
        j = (j + S[i] + key[i % len(key)]) % 128
        S[i], S[j] = S[j], S[i]
 
    i = j = 0
    for char in data:
        i = (i + 1) % 128
        j = (j + S[i]) % 128
        S[i], S[j] = S[j], S[i]
        out.append(char ^ S[(S[i] + S[j]) % 128])
 
    return bytes(out)
 
data = bytes.fromhex("572e180b1a680b3e5276344b241d5b52525a043173346b1355442028")
key = b'NS5_R0Un6_z2_apK'
decrypted = rc4(data, key)
print(decrypted)
#NSSCTF{V3ry_4z_1ib_W1th_4pk}
4. GO!GO!GO!

shell看不出东西,分析主文件

好像是调用了shell

大量的WinAPI调用,有个函数进去看看

似乎是要卸载表面上的内存映像,注入傀儡进程

查询qword_140005080的交叉引用定位到

动调发现qword_140005080内资源开头为MZ,是PE文件

ResourceHacker正好可以提取

非常恶心go语言

这是输入的key1,可以用hashcat爆破

hashcat -m 0 -a 3 b098cacb2d43b882ef9a83168d13c3a7 ?a?a?a?a?a?a

稍等一段时间,烧一会GPU就出来了 G0@K3y

key2是一个道理

hashcat -m 1400 -a 3 c32a69f4609191a2c3e6dbe2effc329bff20617230853462e8745f2c058bec2f ?a?a?a?a?a?a

得到n3SC1f

又输入一段东西进了main_Function2

第三次输入的就是flag

发现RC4特征

有魔改,但是无所谓直接动调

先找一下RC4的密钥,应该和之前的输入有关

看到密钥被拼接了

由于RC4是对称加密,所以可以考虑把密文提出来再写入用原程序解密

先动调取出密文

然后重新动调,找到存储flag的内存位置

patch成密文

动调到加密之后

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于弹簧鞘复合纱和迁移学习算法的可穿戴人体重构和智能试衣系统

研究背景 在信息时代和元宇宙的背景下&#xff0c;虚拟服装设计对满足服装行业的个性化需求至关重要。与传统方法不同&#xff0c;虚拟试衣节省时间、方便客户&#xff0c;并提供多样化的款式。准确得测量人体围度并重构出人体的模型是虚拟试衣的关键。为了实现动态人体重构&a…

路径规划 | RRT结合APF算法快速探索随机树结合人工势场法的路径规划算法(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 RRT结合APF算法的matlab代码。地图为可以替换的栅格地图。代码是在复现华中科技大学发表的英文论文的基础上的进一步改进。RRT算法。人工势场算法。 1.原论文方法简介&#xff1a;针对快速探索随机树&#xff08;RRT&…

用 Pytorch 训练一个 Transformer模型

昨天说了一下Transformer架构&#xff0c;今天我们来看看怎么 Pytorch 训练一个Transormer模型&#xff0c;真实训练一个模型是个庞大工程&#xff0c;准备数据、准备硬件等等&#xff0c;我只是做一个简单的实现。因为只是做实验&#xff0c;本地用 CPU 也可以运行。 本文包含…

C++ STL 容器 vector

目录 1. vector 对象2. vector 大小 size 和 容量 capacity3. vector 成员函数3.1 迭代器3.2 容量3.3 元素访问3.4 插入3.5 删除3.6 动态扩充与收缩 4. vector 迭代器失效问题总结其他补充 本文测试环境为 编译器 gcc 13.1 vector 是 STL 中的一个顺序容器&#xff0c;它给我们…

如何将静态网页资源“打包“成.exe或者.apk

Hello , 我是小恒不会java。最近有音乐播放器win桌面应用程序的需求&#xff0c;那就说说上手electron 又想到很多人对apk文件不太了解&#xff0c;apk文件就是安卓桌面应用程序&#xff0c;比如你手机现在打开的微信 当然&#xff0c;exe文件基本都清楚&#xff0c;windows可执…

正则表达式(Regular Expression)

正则表达式很重要&#xff0c;是一个合格攻城狮的必备利器&#xff0c;必须要学会&#xff01;&#xff01;&#xff01; &#xff08;参考视频&#xff09;10分钟快速掌握正则表达式&#xff08;奇乐编程学院&#xff09;https://www.bilibili.com/video/BV1da4y1p7iZ在线测试…

React Hooks(常用)笔记

一、useState&#xff08;保存组件状态&#xff09; 1、基本使用 import { useState } from react;function Example() {const [initialState, setInitialState] useState(default); } useState(保存组件状态) &#xff1a;React hooks是function组件(无状态组件) &#xf…

再拓信创版图-Smartbi 与东方国信数据库完成兼容适配认证

近日&#xff0c;思迈特商业智能与数据分析软件 [简称&#xff1a;Smartbi Insight] V11与北京东方国信科技股份有限公司 &#xff08;以下简称东方国信&#xff09;CirroData-OLAP分布式数据库V2.14.1完成兼容性测试。经双方严格测试&#xff0c;两款产品能够达到通用兼容性要…

浪潮信息成功打造大规模、高性能、高可靠的单存储集群方案!

为帮助企业应对商业智能应用中面临的关于海量数据存储及实时分析的难题&#xff0c;浪潮信息日前通过技术研发&#xff0c;创新推出全球首个SAP HANA集群方案&#xff0c;该方案实现了最大可支持HANA集群服务器节点数量的翻倍&#xff0c;单存储即可支持16节点的&#xff0c;大…

图片高效批量管理,一键批量旋转150度,高效整理您的图片库

在数字化时代&#xff0c;我们的生活中充满了各种图片。从手机拍照到网络下载&#xff0c;从社交媒体到工作文档&#xff0c;图片无处不在。然而&#xff0c;随着图片数量的不断增加&#xff0c;如何高效管理这些图片&#xff0c;让它们有序、易于查找&#xff0c;成为了许多人…

Vue3从入门到实战:深度了解相关API

shallowRef 作用&#xff1a;创建一个响应式数据&#xff0c;但只对顶层属性进行响应式处理。 用法&#xff1a; let myVar shallowRef(initialValue); 特点&#xff1a;只跟踪引用值的变化&#xff0c;不关心值内部的属性变化。 shallowReactive 作用&#xff1a;创建一个…

【MySQL】表的基本约束

文章目录 1、约束类型1.1NOT NULL约束1.2UNIQUE&#xff1a;唯一约束1.3DEFAULT&#xff1a;默认值约束1.4PRIMARY KEY&#xff1a;主键约束1.5FOREIGN KEY&#xff1a;外键约束 2、表的设计2.1一对一2.2一对多2.3多对多 1、约束类型 关键字解释NOT NULL指示某列不能存储NULL值…

点赞列表查询列表

点赞列表查询列表 BlogController GetMapping("/likes/{id}") public Result queryBlogLikes(PathVariable("id") Long id) {return blogService.queryBlogLikes(id); }BlogService Override public Result queryBlogLikes(Long id) {String key BLOG_…

【C++航海王:追寻罗杰的编程之路】C++11(上)

目录 1 -> C11简介 2 -> 统一的列表初始化 2.1 -> {}初始化 2.2 -> std::initializer_list 3 -> 声明 3.1 -> auto 3.2 -> decltype 3.3 -> nullptr 1 -> C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C…

Debian

文章目录 前言一、使用root用户操作二、配置用户使用sudo命令三、添加桌面图标显示1.打开终端2.执行安装命令3.执行成功后重启4. 打开扩展&#xff0c;配置图标 四、图形化界面关闭和打开五、设置静态IP1.查询自己系统网络接口2.修改网络配置文件 总结 前言 Debian 系统在安装…

基于Springboot+Vue的Java项目-在线文档管理系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

RUOYI 若依 横向菜单

保留移动端适配 小屏适配 菜单权限等 可轻松进行深度自定义菜单样式 以及分布 仅支持横向布局 如需源码 教程等 ➕ wx 技术支持 wx : 17339827025

【IEEE出版 | 中山大学主办 | 往届会后2-4个月EI检索】第五届电子通讯与人工智能学术会议(ICECAI 2024)

第五届电子通讯与人工智能国际学术会议&#xff08;ICECAI 2024&#xff09; 2024 5th International Conference on Electronic communication and Artificial Intelligence 第五届电子通讯与人工智能国际学术会议&#xff08;ICECAI 2024&#xff09;将于2024年5月31日-6月…

淘宝订单交易详情查询API是淘宝开放平台提供的接口,可以通过该接口获取淘宝订单的详细信息。

淘宝订单交易详情查询API是淘宝开放平台提供的接口&#xff0c;可以通过该接口获取淘宝订单的详细信息。通过该API&#xff0c;你可以获取订单的基本信息、商品信息、买家信息、物流信息等。 具体使用该API需要进行以下步骤&#xff1a; 在淘宝开放平台注册开发者账号&#xf…

QA测试开发工程师面试题满分问答15: 讲一讲InnoDB和MyISAM

InnoDB和MyISAM是MySQL中两种常见的存储引擎&#xff0c;它们在数据存储和处理方面有着显著的区别。让我们逐一来看一下它们的区别、原理以及适用场景。 区别&#xff1a; 事务支持&#xff1a;InnoDB是一个支持事务的存储引擎&#xff0c;而MyISAM不支持事务。事务是一种用于维…