CTF 逆向涉及的各种加密算法
rc4 原理研究
在密码学中,RC4(来自 Rivest Cipher 4 的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。RC4 是有线等效加密(WEP)中采用的加密算法,也曾经是 TLS 可采用的算法之一。RC4 算法的原理非常简单,包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两大部分。
RC4 算法流程简单实现
1. 1-256 初始化 S-Box 和临时向量 T
for i in range(0,255):S[i]=iT[i]=K[imodkeylen]
2.初始排列 S-Box 并作乱序处理
j=0for i in range(0,255):j=(j+S[i]+T[i]) %256swap(s[i],s[j])
3.生成密钥流 len:明文为 len 个字节
int i=0,j=0,t;while(len--)i=(i+1)%256;j=(j+S[i])%256;S[i]=S[i]+S[j];S[j]=S[i]-S[j];S[i]=S[i]-S[j];t=(S[i]+S[j])%256;k.push_back(S[t]);
-
将子密钥序列同明文进行异或得到密文
Data[k]^=S[T]
RC4 算法流程简单总结
可能这样还是不便于理解,我们简单来写就是:
1、先初始化状态向量 S(256 个字节,用来作为密钥流生成的种子 1)
按照升序,给每个字节赋值 0,1,2,3,4,5,6.....,254,255
2、初始密钥(由用户输入),长度任意
如果输入长度小于 256 个字节,则进行轮转,直到填满
例如输入密钥的是 1,2,3,4,5 , 那么填入的是 1,2,3,4,5,1,2,3,4,5,1,2,3,4,5........
3、开始对状态向量 S 进行置换操作(用来打乱初始种子 1)
按照下列规则进行:
从第零个字节开始,执行 256 次,保证每个字节都得到处理,确保处理后的状态向量 S 带有一定的随机性。
j = 0;for (i = 0 ; i < 256 ; i++){j = (j + S[i] + T[i]) mod 256;swap(S[i] , S[j]);}
4、密钥流的生成与加密
假设我的明文字节数是 datalength=1024 个字节(当然可以是任意个字节)
i=0;j=0;while(datalength--){//相当于执行1024次,这样生成的秘钥流也是1024个字节i = (i + 1) mod 256;j = (j + S[i]) mod 256;swap(S[i] , S[j]);t = (S[i] + S[j]) mod 256;k = S[t];这里的K就是当前生成的一个秘钥流中的一位//可以直接在这里进行加密,当然也可以将密钥流保存在数组中,最后进行异或就okdata[]=data[]^k; //进行加密,"^"是异或运算符}
RC4 算法逆向特征识别
我们在使用 ida 等逆向分析软件识别 RC4 算法时,应当注意哪些特征呢?主要有下述三条:
S 盒与 T 盒的数据填充过程:2 个长度为 256 的 For 循环 S 盒乱序时的数据交换以及最后的异或加解密
S 盒与 T 盒的数据填充过程:2 个长度为 256 的 For 循环,填充 1~255


s 盒乱序时的数据交换过程

异或/加解密操作

软件辅助识别:
对于标准加密算法,也可以借助 PEID 的“Krypto ANALyzer”插件,或者 IDA 的“FindCrypt2”插件进行识别。
RC4 算法出题与做题
出题:菜鸡的一次 c++rc4 加密尝试
通过上文介绍,我们对于 RC4 算法以及有了一个初步的认识,这样我们尝试使用 c++写出一道简单的 rc4 加密逆向题目,源码如下
#include<bits/stdc++.h>#include<windows.h>using namespace std;char* base64Encode(char const* origSigned, unsigned origLength) //由于rc4加密后多为不可见字符或乱码,采用base64做中介{static const char base64Char[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";unsigned char const* orig = (unsigned char const*)origSigned;if (orig == NULL) return NULL;unsigned const numOrig24BitValues = origLength/3;bool havePadding = origLength > numOrig24BitValues*3;bool havePadding2 = origLength == numOrig24BitValues*3 + 2;unsigned const numResultBytes = 4*(numOrig24BitValues + havePadding);char* result = new char[numResultBytes+1];// Map each full group of 3 input bytes into 4 output base-64 characters:unsigned i;for (i = 0; i < numOrig24BitValues; ++i){result[4*i+0] = base64Char[(orig[3*i]>>2)&0x3F];result[4*i+1] = base64Char[(((orig[3*i]&0x3)<<4) | (orig[3*i+1]>>4))&0x3F];result[4*i+2] = base64Char[(((orig[3*i+1]&0x0f)<<2) | (orig[3*i+2]>>6))&0x3F];result[4*i+3] = base64Char[(orig[3*i+2]&0x3f)&0x3F];}// Now, take padding into account. (Note: i == numOrig24BitValues)if (havePadding){result[4*i+0] = base64Char[(orig[3*i]>>2)&0x3F];if (havePadding2){result[4*i+1] = base64Char[(((orig[3*i]&0x3)<<4) | (orig[3*i+1]>>4))&0x3F];result[4*i+2] = base64Char[((orig[3*i+1]&0x0f)<<2)&0x3F];}else{result[4*i+1] = base64Char[((orig[3*i]&0x3)<<4)&0x3F];result[4*i+2] = '=';}result[4*i+3] = '=';}result[numResultBytes] = '/0';return result;}void mima_init(unsigned char *s,unsigned char *key,unsigned long Len)//初始化{char t[256]={0};unsigned char tmp=0;for(int i=0;i<256;i++)//初始化s盒{s[i]=i;t[i]=key[i%Len];}for(int i=0;i<256;i++)//s盒乱序{int j=(j+s[i]+t[i])%256;tmp=s[i];s[i]=s[j];s[j]=tmp;}}//加解密共用函数char mima_crypt(unsigned char *s,unsigned char *Data,unsigned long Len){int i=0,j=0,t=0;unsigned long k=0;unsigned char tmp;for(k=0;k<Len;k++){//密钥流i=(i+1)%256;j=(j+s[i])%256;tmp=s[i];s[i]=s[j];s[j]=tmp;t=(s[i]+s[j])%256;//异或加解密Data[k]^=s[t];}}int getStr(char *buffer,int maxLen){char c; // 读取到的一个字符int len = 0; // 当前输入的字符串的长度// 一次读取一个字符,保存到buffer// 直到遇到换行符(\n),或者长度超过maxLen时,停止读取while( (c=getchar()) != '\n' ){buffer[len++]=c; // 将读取到的字符保存到bufferif(len>=maxLen){break;}}buffer[len]='\0'; // 读取结束,在末尾手动添加字符串结束标志fflush(stdin); // 刷新输入缓冲区return len;}int main(int argc,_TCHAR* argv[]){char key[256]={""};//可以自定义keychar flag[25];uint8_t keyLen = 0;char pData[256]={"f5pwXQlV5R9HMfFL6pt3YdVEeP5d9DA="};//密文unsigned char s1[256]={0},s2[256]={0};unsigned long len= strlen(pData);printf("please input your flag:\n");getStr(flag,23);//初始化//unsigned long len= strlen(flag2);mima_init(s1, (unsigned char*)key, strlen(key));mima_crypt(s1, (unsigned char*)flag, len);//cout<<(unsigned char*)base64Encode(flag,strlen(flag));if(!strcmp("rFZuHVPo6wTcVnbgu176lPOJWixo93wdm2ULsM5fFrc=0",base64Encode(flag,strlen(flag))))//判定机制写的不完善导致的暴力判定printf("you are right good boy!\n");elseprintf("Try again!");cout<<(unsigned char*)base64Encode(flag,strlen(flag));}
做题:[安恒杯 2018-9 月]NewDriver
老规矩,拿到 re 题目先查壳。无壳 32 位。ida 打开。
上来就整个假 flag 欺骗我们的感情。

发现三个可疑的可能与加解密相关的函数

显然是一个 base64 加密,且搜索字符串中找到了自定义的 base64 表,印证了我们的猜测。

跟进剩下两个关键函数,发现 rc4 加密特征(异或,s 盒初始化,处理密钥流过程中的 %256)


在 ida 中可以直接获取密文,获取 key 的话要使用动态调试从内存中读取
这个时候我们只需要模拟异或过程就可以了
key = '7a a6 6a da cd 0f 16 74 8b be 29 67 aa 79 79 b2 42 64 b2 2c bc 93 18 07 19 6f b7 64 fd 52 59 4f 96 ea 49 3c 11 89 66 39 87 d3 59 84'en_flag = '20 C3 1A AE 97 3C 7A 41 DE F6 78 15 CB 4B 4C DC 26 55 8B 55 E5 E9 55 75 40 3D 82 13 A5 60 13 3B F5 D8 19 0E 47 CF 5F 5E DE 9D 14 BD'key = key.split(' ')en_flag = en_flag.split(' ')en_flags = []keys = []g = ''for i in key:keys.append(int(i, 16))for i in en_flag:en_flags.append(int(i, 16))for q in range(len(key)):g += chr(keys[q] ^ en_flags[q])print(g)运行脚本后再 base64 解密得到 flag

顺便存一手 base64 换表脚本准备不能联网的线下赛。
import base64import stringstr1 = "x2dtJEOmyjacxDemx2eczT5cVS9fVUGvWTuZWjuexjRqy24rV29q"string1 = "ZYXABCDEFGHIJKLMNOPQRSTUVWzyxabcdefghijklmnopqrstuvw0123456789+/"string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))
题外话
初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:
-
2023届全国高校毕业生预计达到1158万人,就业形势严峻;
-
国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。
一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。
6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。
2022届大学毕业生月收入较高的前10个专业
本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。
具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。

“没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。
网络安全行业特点
1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!

2、人才缺口大,就业机会多
2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。

行业发展空间大,岗位非常多
网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…
职业增值潜力大
网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。
随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。
从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。
如果你对网络安全入门感兴趣,那么你点击这里👉CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
如果你对网络安全感兴趣,学习资源免费分享,保证100%免费!!!(嘿客入门教程)
1.成长路线图&学习规划
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


2.视频教程
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。


3.SRC&黑客文籍
大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录
SRC技术文籍:

黑客资料由于是敏感资源,这里不能直接展示哦!
4.护网行动资料
其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

5.黑客必读书单

6.面试题合集
当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。

更多内容为防止和谐,可以扫描获取~

这份完整版的网络安全(嘿客)全套学习资料已经上传至CSDN官方,朋友们如果需要点击下方链接也可扫描下方微信二v码获取网络工程师全套资料【保证100%免费】
