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
英文地址,請注明出處:http://en.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;比較典型的傳感器…