25.9.10_CTF-reverse_RC4那些事儿

CTF-reverse_RC4那些事儿

0x00 RC4加密知识点

推荐看这位up主的视频https://www.bilibili.com/video/BV1G64y1Y7p4/?spm_id_from=333.1391.0.0&p=2

简单来说RC4算法包括两部分KSA(利用Key生成S盒)和PRGA(利用S盒生成密钥流):

KSA:

  1. 初始化S(一般是0-255)
  2. 初始化K(循环填充密钥key)
  3. 利用K来打乱S

PRGA:

生成密钥流进行异或加密

所以我们的思路就是按照原来的KSA和PGRA算法来得到密钥流,利用异或加密的对称性求解,下面以几道题来深入理解ctf中的rc4解密套路

0x01 [GHCTF 2024 新生赛]UP+

1.做题过程

拖入DIE中,32位,upx壳

image-20250910112029475

upx -d解壳发现报错

image-20250910112131737

我们用010editor打开,将ZVM修改为UPX(55 50 58)

image-20250910112252057

再次upx -d脱壳

image-20250910112326638

在ida中打开,发现是很标准的RC4算法:

image-20250910112441752

于是手搓脚本

2.EXP

key='justfortest'
S=[]
K=[]
enc_flag=[0x42,0xFD,0x55,0x61,0xB9,0x27,0x6F,0xF5,0xB6,0x86,0x23,0xA9,0xEF,0x1C,0x4,0x9F,0xD4,0x16,0x87,0xD6,0x54,0x68,0xBC,0x2,0x15,0x6D,0x30,0x8,0x4B,0x61,0x4C,0x5E]#这里注意xmmword_402140在前面,xmmword_402130在后面
flag=[]
v5=0
for i in range(0,256):S.append(i)K.append(ord(key[i%len(key)]))
for i in range(0,256):v5=(v5+S[i]+K[i])%256temp=S[v5]S[v5]=S[i]S[i]=temp#以上是KSA算法,就是copy伪码
i,j=0,0
for k in range(0,len(enc_flag)):i=(i+1)%256j=(S[i]+j)%256S[i],S[j]=S[j],S[i]flag.append(enc_flag[k]^S[(S[i]+S[j])%256])#这里是PGRA算法,注意密钥流并不是一次性生成的,而是边加密边生成的
print("".join(map(chr,flag)))

这里值得注意的是刚开始我以为密钥流是一次性生成的,最后再依次加密,但是加密过程其实是在密钥流生成的过程中进行的

Get_flag:NSSCTF{4950b6562657477e6685828e537f43e5}

3.其他

当然在cyberchef中可以直接梭(找到密文,密钥即可)

image-20250910113127331

只是这道题比较典型,手搓脚本可以更好地理解rc4算法的逻辑,今后识别到rc4算法,只需要找到密文和密钥就可以到cyberchef中一把梭了

0x02 [SWPUCTF 2022 新生赛]pypy

1.做题思路

得到一个pyc文件,在在线网站反编译python反编译 - 在线工具

题目比较简单,直接在源码的基础上写脚本,只需要把输入的text换为后面的res数组就可以了,这道题先是生成的密钥流再逐个异或的,而不是边生成边异或

2.EXP

def init_S():for i in range(256):S.append(i)
def init_T():global KeyKey = 'abcdefg'keylen = len(Key)for i in range(256):tmp = Key[i % keylen]T.append(tmp)
def swap_S():j = 0for i in range(256):j = (j + S[i] + ord(T[i])) % 256tmp = S[i]S[i] = S[j]S[j] = tmp
def Get_KeyStream():txtlen = len(text)(j, t) = (0, 0)for i in range(txtlen):i = i % 256j = (j + S[i]) % 256tmp = S[i]S[i] = S[j]S[j] = tmpt = (S[i] + S[j]) % 256KeyStream.append(S[t])
def Get_code():res = []for i in range(len(text)):res.append(text[i] ^ KeyStream[i])return res
if __name__ == '__main__':T = []S = []Key = []PlainText = ''CryptoText = ''KeyStream = []# text = input('please input you flag:\n')text=[84,91,254,48,129,210,135,132,112,234,208,15,213,39,108,253,86,118,248]init_S()init_T()swap_S()Get_KeyStream()res = Get_code()print("".join(map(chr, res)))# for i, ele in enumerate(res):#     if not ele == [#         84,#         91,#         254,#         48,#         129,#         210,#         135,#         132,#         112,#         234,#         208,#         15,#         213,#         39,#         108,#         253,#         86,#         118,#         248][i]:#         print('bad')#         exit()# print('good')

Get_flag:NSSCTF{this_is_rc4}

0x03 [LitCTF 2025]easy_rc4

1.做题思路

ida打开

image-20250910213425008

这里看到又是’FenKey!!‘,多留了一个心眼,按x查看引用情况,发现只有这个函数引用了,所以key就是’FenKey!!’

image-20250910213535017

看了rc4_init和标准的KSA是一样的,但是PRGA魔改了

屏幕截图 2025-09-10 213633

问题不大,还是提取密文和密钥,到cyberchef中,多加个异或就行了:

image-20250910213807974

Get_flag:LitCTF{71bb2a06417a5306ba297ddcfce7b1b0}

(www动调还不是很熟练,很多师傅都用的是动调,后面还得学啊)

0x04 写在最后的

做了几道RC4的题,其实这就是一个对称加密,可能会魔改。一般思路就是找到key和密文,上cyberchef梭,或者编写脚本进行破解,还有就是动调(这个还不太会),但是RC4一般不会作为一个单独的考点出现,可能会和upx壳,反动调等等其他知识点出现,但是本次练习主要是学习一下RC4的最最最基本原理,后面会学习其他的相关知识。

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

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

相关文章

网络编程(6)

【0】复习 Modbus:modbus tcp modbus rtu Modbus TCP: 特点:主从问答(控制 采集信息) 应用层协议(基于TCP通信)、默认端口502 组成:报文头(7 事物2 协议2 长度2 单元表示1&#xff…

技术文章大纲:AI绘画—动漫角色生成赛

技术文章大纲:AI绘画—动漫角色生成赛 背景与意义 动漫角色生成赛的兴起与发展AI绘画技术在动漫创作中的应用价值比赛对推动AI艺术创新的作用 技术核心:AI绘画模型 主流模型介绍(如Stable Diffusion、MidJourney、DALLE)针对动…

Flink-新增 Kafka source 引发状态丢失导致启动失败

背景 Flink Job 新增 kafka source 算子,从状态保留并启动后提示 org.apache.flink.util.StateMigrationException: The new state typeSerializer for operator state must not be incompatible,导致任务 Fail。 Source: task-kafka-source -> task-kafka-transform (1…

【系统架构设计(26)】系统可靠性分析与设计详解:构建高可用软件系统的核心技术

文章目录一、本文知识覆盖范围1、概述2、知识体系概览二、系统可靠性基础概念1、可靠性与可用性的本质区别2、软件可靠性与硬件可靠性的深度对比3、核心可靠性指标的业务价值三、系统架构可靠性模型1、串联系统的可靠性挑战2、并联系统的高可靠性设计3、混合系统的复杂性管理四…

4 C 语言数据结构实战:栈和队列完整实现(结构体 + 函数)+ 最小栈解决方案

栈和队列 1. 栈 栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作 的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈&…

Milvus基于docker主机外挂实践

一、安装docker与我之前写的原博客:ubuntu安装milvus向量数据库,获取key不同,原博客获取key已经过时# 更新Ubuntu软件包列表和已安装软件的版本: sudo apt update# 安装Ubuntu系统的依赖包 sudo apt-get install ca-certificates curl gnupg …

使用python test测试http接口

使用python test测试http接口获取token和控制session,后面大多数接口要带上这些信息 import time import requestsfrom common.aes_algorithm import AES from config.config import Config from config.log import logclass Common:username "admin"pas…

平时只会CRUD,没有高质量项目经验,我该怎么办

我没有项目经验怎么办 首先,不管是应届生还是社招几年工作经验的朋友,除非特别厉害的人,大家都会遇到这个问题。 我们该怎么处理,关注hikktn!为你解答这个问题。 问AI世面上那个大厂程序员项目推荐 为什么这么说呢&…

网编.hw.9.10

云盘下载#include <myhead.h> #define SER_IP "192.168.108.93" #define SER_PORT 69 #define addr "192.168.109.6" #define port 8888/******************主程序******************/ int main(int argc, const char *argv[]) {//1、创建一个用于通…

Java调用magic-api中post接口参数问题

Java调用magic-api中post接口参数问题magic官方文档中只提供了get写法解决方法magic官方文档中只提供了get写法 实测使用官方写法调用get接口可调通&#xff0c;参数正常获取&#xff0c;但更换为post写法后&#xff0c;magic脚本中body获取为空 Autowired MagicAPIService s…

《sklearn机器学习——管道和复合估计器》联合特征(FeatureUnion)

超详细解说 sklearn 中的联合特征&#xff08;FeatureUnion&#xff09; 1. FeatureUnion 简介 FeatureUnion 是 scikit-learn 中的一个工具&#xff0c;用于并行地组合多个特征提取器的输出。它允许你将不同的特征提取方法&#xff08;如文本向量化、数值特征缩放、自定义特征…

Eyeshot 2025.3 3D 图形工具包

Eyeshot 2025.3 现在支持 E57 格式Eyeshot 2025.3 现在支持 E57 格式&#xff0c;可直接从 3D 扫描系统导入点云、图像和元数据。Eyeshot 由 devDept 开发&#xff0c;是一款功能全面的 3D 图形工具包&#xff0c;专为构建工程和 CAD(计算机辅助设计)应用程序的 .NET 开发人员而…

OpenResty 配合 Lua 脚本的使用

OpenResty 配合 Lua 脚本的使用实践 在高并发互联网服务中&#xff0c;传统的 Web 服务器往往难以同时兼顾性能与灵活性。而 OpenResty 作为一个基于 Nginx LuaJIT 的高性能 Web 平台&#xff0c;能够让我们在保持 Nginx 高并发性能的同时&#xff0c;使用 Lua 脚本 动态扩展其…

香港券商櫃台系統發展分析與市場觀察

香港券商櫃台系統發展分析與市場觀察 一、市場環境與交易機制變革 2025年以來&#xff0c;香港證券市場表現活躍。港交所現貨市場平均每日成交金額達2,402億港元&#xff0c;同比增長118%。南向交易&#xff08;港股通&#xff09;日均成交額佔比提升至23%&#xff0c;單日淨…

AR技术:多行业数字化转型的加速引擎

在数字化浪潮的推动下&#xff0c;增强现实&#xff08;AR www.teamhelper.cn &#xff09;技术正突破传统娱乐和游戏领域的局限&#xff0c;成为各行业数字化转型的重要力量。从工业制造到医疗健康&#xff0c;从教育培训到零售购物&#xff0c;AR技术以其独特的虚实融合能力&…

第6篇、Kafka 高级实战:生产者路由与消费者管理

Kafka 高级实战&#xff1a;生产者路由与消费者管理&#xff08;Python 版&#xff09;从基础到进阶&#xff1a;深入理解 Kafka 的生产者消息路由、消费者 Offset 管理&#xff0c;以及 Exactly-Once 语义实现 实战导向&#xff1a;提供完整的可运行代码示例&#xff0c;涵盖自…

基于Python读取多个excel竖向拼接为一个excel

在Python中&#xff0c;可以使用pandas库结合glob模块来遍历读取多个Excel文件&#xff0c;并将它们竖向拼接为一个DataFrame对象。以下是完整的实现方法&#xff1a; 文章目录方法1&#xff1a;使用glob匹配文件 pd.concat()方法2&#xff1a;使用列表推导式&#xff08;更简…

Linux《进程信号(下)》

在之前的Linux《进程信号&#xff08;上&#xff09;》当中我们已经了解了进程信号的基本概念以及知道了信号产生的方式有哪些&#xff0c;还了解了信号是如何进行保存的&#xff0c;那么接下来在本篇当中就将继续之前的学习了解信号是如何处理的。除此之外还会了解到中断的概念…

android 性能优化—ANR

ANR产生原理ANR&#xff08;Application Not Responding&#xff09;是 Android 对 “应用主线程卡死” 的系统级保护机制&#xff1a; 当 输入事件、广播、服务 等在规定时间内未被处理完毕&#xff0c;SystemServer 会弹框并杀进程&#xff0c;防止整个系统跟着假死。计时起点…

stm32——单总线,DHT11

目录 一、单总线协议的原理和应用 单总线协议指的是只采用一根信道来进行数据传输&#xff0c;通信指的是双方&#xff08;MCU与传感器&#xff09;通过一根信道进行数据交互&#xff0c;所以按照数据的传输方向&#xff0c;只能采用半双工通信方式&#xff0c;比较典型的传感器…