NSSCTF ROUND#28 Ciallo~(∠・ω )⌒☆ WriteUp

news/2025/3/22 22:50:49/文章来源:https://www.cnblogs.com/Binary-0/p/18787228

WriteUp

题目信息

来源:NSSCTF
名称:ROUND#28 Ciallo~(∠・ω )⌒☆
分类:Reverse
描述:无

题目链接: https://www.nssctf.cn/contest/732/

解题思路

首先使用DIE对文件进行查壳,发现这是一个无壳的64位exe文件。

于是使用64位IDA对文件进行反汇编,得到伪代码如下:

先一步步观察伪代码,

首先开始设置了一串Buf,我们暂且搁置;然后程序要求输入24位长度的字符串;接着v8数组设置了一些初始值,我们也暂且搁置;
再往后,我们发现我们输入的字符串被v11指针引用,然后通过tea_encrypt加密了;之后,又设置了一个v7并且被赋值了一个字符串;
然后通过rc4_init和rc4_crypt函数,得到Buf1;最后Buf1与Buf2比较,从而判断输入字符串的对错。

整体分析这份伪代码,通过函数名和函数的具体伪代码,其实可以猜想到我们的字符串先后通过TEA、RC4算法被加密,最后得到的密文与Buf2比对。
那么我们要的flag就可以根据Buf2先后通过RC4、TEA算法被解密得到。
其中RC4算法的密钥就是"harukaze",而TEA算法的密钥则是v8数组。

Key:
RC4:harukaze
TEA:

如此以来,我们便可以开始编写脚本来进行加密解密操作了,脚本如下:

def int_array_to_bytes(int_array):byte_list = []for num in int_array:byte_list.append(num.to_bytes((num.bit_length() + 7) // 8, 'little'))return b''.join(byte_list)int_array = [0x22F1A4AB5685839C, 0xB54F2680858F71DE, 0x903E60C602476C37]
byte_str = int_array_to_bytes(int_array)
print(byte_str)

先将Buf2数组转换成字节串,方便后续操作
Buf2:b'\x9c\x83\x85V\xab\xa4\xf1"\xdeq\x8f\x85\x80&O\xb57lG\x02\xc6`>\x90'

def rc4(key):S = list(range(256))j = 0out = []# 将字符串密钥转换为整数序列key = [ord(c) for c in key]# 密钥调度算法(KSA)for i in range(256):j = (j + S[i] + key[i % len(key)]) % 256S[i], S[j] = S[j], S[i]return Sdef rc4_encrypt(data, key):S = rc4(key)encrypted = []i = j = 0for byte in data:i = (i + 1) % 256j = (j + S[i]) % 256S[i], S[j] = S[j], S[i]k = S[(S[i] + S[j]) % 256]encrypted.append(byte ^ k)return bytes(encrypted)def rc4_decrypt(data, key):return rc4_encrypt(data, key)key = "harukaze"  # 密钥
data = b'\x9c\x83\x85V\xab\xa4\xf1"\xdeq\x8f\x85\x80&O\xb57lG\x02\xc6`>\x90'
print("原文:", data)
encrypted_data = rc4_encrypt(data, key)
print("加密后:", encrypted_data)
decrypted_data = rc4_decrypt(encrypted_data, key)
print("解密后:", decrypted_data)

由于我们得到的本身就是密文,根据对称密码RC4,密文加密得到的其实就是原文,
原文——b'\xc2{K\x0c\x17?\xf2p\x10\x1b2SO\xd9\xe3\xa8\xc4E\x01\xa6(\x0c\xa1\xb9'

import structdef tea_encrypt(v, k):y, z = struct.unpack('<II', v)UINT32_MAX = 0xffffffffdelta = 0x9e3779b9sum = 0n = 32w = [0] * 4for i in range(0, 4):w[i] = k[i]while n > 0:sum = (sum + delta) & UINT32_MAXy = (y + ((((z << 4) + w[0]) & UINT32_MAX) ^ ((z+sum) & UINT32_MAX) ^ (((z >> 5) + w[1]) & UINT32_MAX))) & UINT32_MAXz = (z + ((((y << 4) + w[2]) & UINT32_MAX) ^ ((y+sum) & UINT32_MAX) ^ (((y >> 5) + w[3]) & UINT32_MAX))) & UINT32_MAXn -= 1return struct.pack('<II', y, z)def encrypt_string(s, key):# 将字符串转换为字节串s = s.encode('latin - 1')blocks = []k = 0for i in range(0, len(s), 8):block = s[i:i+8]if len(block) < 8:block = block + b'\0' * (8 - len(block))blocks.append(tea_encrypt(block, key))return b''.join(blocks)def tea_decrypt(v, k):y, z = struct.unpack('<II', v)UINT32_MAX = 0xffffffffdelta = 0x9e3779b9sum = (32 * delta) & UINT32_MAXn = 32w = [0] * 4for i in range(0, 4):w[i] = k[i]while n > 0:z = (z - ((((y << 4) + w[2]) & UINT32_MAX) ^ ((y+sum) & UINT32_MAX) ^ (((y >> 5) + w[3]) & UINT32_MAX))) & UINT32_MAXy = (y - ((((z << 4) + w[0]) & UINT32_MAX) ^ ((z+sum) & UINT32_MAX) ^ (((z >> 5) + w[1]) & UINT32_MAX))) & UINT32_MAXsum = (sum - delta) & UINT32_MAXn -= 1return struct.pack('<II', y, z)def decrypt_string(s, key):blocks = []k = 0for i in range(0, len(s), 8):block = s[i:i+8]blocks.append(tea_decrypt(block, key))result = b''.join(blocks)return result.decode('latin - 1').rstrip('\0')key = [0x12345678, 0x9ABCDEF0, 0x2468ACE0, 0xF13579B3]test = b'\xc2{K\x0c\x17?\xf2p\x10\x1b2SO\xd9\xe3\xa8\xc4E\x01\xa6(\x0c\xa1\xb9'
print(decrypt_string(test, key))

使用工具

DIE
IDA
Vscode

工具链接: https://pan.baidu.com/s/1dzK8gcFjYEvnj_aA0UjBeQ?pwd=ry2d 提取码: ry2d

Flag

NSSCTF{Harukaze_l0ve_r3}

总结

通过本次题目学习到:
RC4算法
TEA算法

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

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

相关文章

day35 nfs共享服务器的学习

day35 nfs共享服务器的学习 1.企业集群为什么要共享服务器 没有共享服务器先看一下没有共享服务器的问题 A用户上传啦图片到web01的服务器,然后B用户访问但是负载均衡服务器把请求分发到了web02的服务器上,导致B用户查看不了图片。配置啦共享服务器无论是用户把图片发送给web…

Nature Communications | 全基因组沉默子图谱揭示人类细胞基因调控新机制

摘要总结 这篇文章是2025年1月发表在《Nature Communications》杂志上的一篇研究,标题为“Uncovering the whole genome silencers of human cells via Ss-STARR-seq”。这篇文章通过开发一种名为Ss-STARR-seq的高通量筛选技术,首次在全基因组范围内系统性鉴定了人类细胞中的…

数据结构3

基本数据处理技术概率论与数理统计1-基本概念 概率论与数理统计2-基本数据结构 概率论与数理统计3-基本数据处理技术 基本的数据处理技术 查找 查找的基本概念 在哪里找:查找表是由同一类型的数据元素(或记录)构成的集合,集合中的数据元素之间关系松散。 按什么查找:根据给…

NSSCTF ROUND#28 动态调试 WriteUp

WriteUp 题目信息 来源:NSSCTF 名称:ROUND#28 动态调试 分类:Reverse 描述:无题目链接: https://www.nssctf.cn/contest/732/解题思路 首先使用DIE对文件进行查壳,发现这是一个无壳的32位ELF文件。于是使用32位IDA对文件进行反汇编,得到伪代码如下:为方便阅读伪代码,修…

Video Analysis Assignment

This scene is what the heroine saw from a begin sycarmore at the first time . It was this landscape that awake the heroine of her father’s word: “ A painting is more than the sum of its parts”. This scene is shot from the big sycarmore and it is a estab…

AI一键生成流程图架构图甘特图饼图等可视化图形 原创

AI脑图除了使用文字、语音、图片、文件、网页和视频等一键生成思维导图外,现在也可以支持一键生成流程图、架构图、甘特图等可视化图形了,使用非常简单,告诉AI脑图你想要生成什么图,大概不到两分钟就会制作好并以图片回复给你啦。 支持的可视化图形有: 流程图 例如向AI脑图…

Atcoder ABC398.F - ABCBA 题解 KMP的next函数

题目链接:https://atcoder.jp/contests/abc398/tasks/abc398_f 题目大意: 给你一个字符串 \(s\),要求在字符串 \(s\) 的末尾添加尽可能少的字符使其变成一个回文串。 解题思路: 首先,设输入的字符串为 \(s = s_1 s_2 \ldots s_n\),设字符串 \(s\) 翻转后的字符串为 \(s\)…

方法的定义和调用

//方法的应用 package Base; public class Demon16 { public static void main(String[] args) {// TODO Auto-generated method stubint max=max(10,10);System.out.println(max); } //比大小 public static int max(int num1,int num2) {int result=0;if(num1==num2) {System…

浅说线性差分和树上差分

目录线性差分正常思路差分思路二维差分的定义二维差分的解释例题1 地毯树上差分引入点差分例题1——wwx的出玩分析与解答例题2——松鼠的新家分析与解答边差分例题1——边差分模版分析与解答例题2——运输计划分析与解答 线性差分 当我们这里有\(n\)个数,现在我要对其中一段进…

Spring 事务失效

场景1:代码:执行结果:异常抛出,但是数据没有回滚。 代理对象调用 b() 方法 没有开启事务:普通对象调用a() 方法开启事务:在b() 方法上加入事务注解,开启事务就没问题:本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/18787133

征程 6X CAMSYS 性能测试方案介绍

1.性能测试方法原理 CAMSYS 其性能指标主要包括:帧率、延迟,以及系统的 DDR 带宽、CPU 占用率等。 对于帧率、延迟,通过在驱动中创建 trace event,分别记录通路上的每个 IP,每帧开始处理(frame_start)和结束处理(frame_end)的时间戳信息和帧信息,来实现帧率计算和延迟…

数据结构2

概率论与数理统计1-基本概念 概率论与数理统计2-基本数据结构 概率论与数理统计3-基本数据处理技术 基本的数据结构 - 数据结构- 数据的逻辑结构- 线性结构- 线性表- 栈(特殊的线性表)- 队列(特殊的线性表)- 字符串- 数组- 广义表- 非线性结构- 树型结构- 图型结构- 数据的存储…