CTFReverse模块系列分享(四):核心实战!字符串加密还原,编写脚本直接拿Flag

admin 2026-01-13 14:22:46 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文深入解析CTFReverse模块中字符串加密还原的核心实战技巧,重点讲解异或、移位及简单替换三种高频算法的识别与还原逻辑。通过IDA分析伪代码提取关键参数,推导逆向还原思路并编写Python脚本直接获取Flag。文章涵盖综合加密案例及常见避坑指南,帮助新手掌握编写解题脚本的核心能力。 综合评分: 85 文章分类: CTF,逆向分析,软文广告,安全培训


cover_image

CTF Reverse模块系列分享(四):核心实战!字符串加密还原,编写脚本直接拿Flag

原创

龙哥网络安全

龙哥网络安全

2026年1月13日 09:42 湖南

上期我们学会了用IDA找主函数、看伪代码、定位加密逻辑,今天咱们就进入Reverse基础题型的核心实战:字符串加密与逻辑还原。

字符串加密是CTF Reverse中最基础、最高频的题型,90%的新手入门题都是这类。今天我会拆解3种最常见的加密类型(异或、移位、简单替换),每种都按IDA分析加密逻辑→推导还原思路→编写Python还原脚本→验证结果的流程讲解,全程实战,看完就能上手写出自己的第一个Reverse解题脚本,直接拿到Flag!

加密和还原是“互逆操作”——只要搞懂加密时程序做了什么,反过来做就能还原出正确输入。新手不用怕写脚本,今天的脚本都很简单,复制修改关键参数就能用!

一、本期核心目标

今天我们的目标很清晰,学会这3件事,就能应对所有基础字符串加密题:

  1. 识别3种高频加密类型:异或加密、移位加密、简单替换加密(通过IDA伪代码快速判断)。
  2. 掌握“加密逻辑→还原思路”的推导方法:知道加密时程序做了什么,就知道还原该做什么。
  3. 编写Python还原脚本:用简单的代码实现还原逻辑,输出正确输入(Flag)。

今天的所有实战案例,都用真实Reverse题的简化版(Windows exe+Linux elf双版本),和CTF比赛题型完全一致,跟着操作就能积累实战经验!

二、高频加密类型实战:从分析到还原,一步到位

我们按难度从低到高的顺序,拆解3种高频加密类型。每种类型都先通过IDA分析加密逻辑,再推导还原思路,最后编写脚本——新手重点学逻辑推导,脚本只是工具,理解思路才是核心!

  • 类型1:异或加密(最基础、最高频!)

异或加密是Reverse中最常见的加密方式,核心逻辑是“输入字符 XOR 密钥 = 加密字符”。记住一个关键特性:异或两次等于原数(a XOR key XOR key = a)——这是还原的核心原理!

步骤1:用IDA分析加密逻辑

我们先看一个异或加密程序的伪代码(通过IDA F5查看,和上期学的操作一致):

int main() {
    char input[20];
    char key = 0x13; // 加密密钥
    char target[] = "x5@G7#kM"; // 加密后的目标字符串(正确输入加密后的值)

    printf("请输入Flag:");
    gets(input); // 输入要验证的字符串

    // 加密逻辑:输入的每个字符和key异或
&nbsp; &nbsp;&nbsp;for&nbsp;(int&nbsp;i =&nbsp;0; i < strlen(input); i++) {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;input[i] ^= key; // 核心加密操作:异或key
&nbsp; &nbsp; }

&nbsp; &nbsp; // 验证逻辑:加密后的输入和target一致,则输出正确
&nbsp; &nbsp;&nbsp;if&nbsp;(strcmp(input, target) ==&nbsp;0) {
&nbsp; &nbsp; &nbsp; &nbsp; printf("Flag正确!\n");
&nbsp; &nbsp; }&nbsp;else&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; printf("Flag错误!\n");
&nbsp; &nbsp; }
&nbsp; &nbsp;&nbsp;return0;
}

通过伪代码,我们能提取3个关键信息:

① 加密算法:异或(^运算符);

② 加密密钥:0x13(十六进制,转十进制是19); ③ 目标字符串:”x5@G7#kM”(正确输入加密后的结果)。

步骤2:推导还原思路

加密逻辑:输入字符 XOR 0x13 = 加密字符(target中的字符)。

还原逻辑(逆操作):加密字符 XOR 0x13 = 输入字符(正确Flag)。

原因:异或两次等于原数,加密时异或了一次key,还原时再异或一次key即可。

步骤3:编写Python还原脚本

脚本核心:遍历target中的每个字符,依次和key(0x13)异或,得到正确输入。脚本很简单,注释详细,新手直接复制修改即可:

# 异或加密还原脚本
key =&nbsp;0x13&nbsp;&nbsp;# 从IDA中提取的加密密钥
target =&nbsp;"x5@G7#kM"&nbsp;&nbsp;# 从IDA中提取的目标字符串(加密后的值)
flag =&nbsp;""

# 遍历target的每个字符,异或key还原
for&nbsp;c&nbsp;in&nbsp;target:
&nbsp; &nbsp;&nbsp;# ord(c):把字符转成ASCII码;chr():把ASCII码转回字符
&nbsp; &nbsp; flag +=&nbsp;chr(ord(c) ^ key)

# 输出还原后的正确Flag
print("正确Flag:", flag)

步骤4:验证结果

运行脚本,输出结果:正确Flag: flag{1234ab}(示例结果,实际以你的脚本运行为准)。把这个结果输入程序,就能看到“Flag正确!”——成功拿到Flag!

小技巧:如果密钥是字符串(比如key=”abc123″),还原时按“字符对应密钥的每个字符”依次异或(循环使用密钥),比如输入第1个字符对应key[0],第2个对应key[1],直到密钥用完再从头开始。

  • 类型2:移位加密(循环移位/凯撒加密)

移位加密的核心逻辑是“输入字符的ASCII码,向左/向右移动n位”(比如’a’的ASCII码是97,向右移3位就是100,对应’d’),常见于凯撒加密、循环移位加密。

步骤1:用IDA分析加密逻辑

看一个“向右循环移位3位”的加密伪代码:

int&nbsp;main() {
&nbsp; &nbsp; char&nbsp;input[20];
&nbsp; &nbsp; char target[] =&nbsp;"kL`f9]vM"; // 加密后的目标字符串
&nbsp; &nbsp;&nbsp;int&nbsp;shift =&nbsp;3; // 移位位数:向右移3位

&nbsp; &nbsp; printf("请输入Flag:");
&nbsp; &nbsp; gets(input);

&nbsp; &nbsp; // 加密逻辑:每个字符向右循环移位3位
&nbsp; &nbsp;&nbsp;for&nbsp;(int&nbsp;i =&nbsp;0; i < strlen(input); i++) {
&nbsp; &nbsp; &nbsp; &nbsp; // (input[i] >>&nbsp;3):向右移3位;(input[i] <<&nbsp;5):向左移5位;|:按位或,实现循环
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;input[i] = (input[i] >>&nbsp;3) | (input[i] <<&nbsp;5);
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;if&nbsp;(strcmp(input, target) ==&nbsp;0) {
&nbsp; &nbsp; &nbsp; &nbsp; printf("Flag正确!\n");
&nbsp; &nbsp; }&nbsp;else&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; printf("Flag错误!\n");
&nbsp; &nbsp; }
&nbsp; &nbsp;&nbsp;return0;
}

提取关键信息:

① 加密算法:向右循环移位3位;

② 移位位数:3位;

③ 目标字符串:”kL`f9]vM”。

步骤2:推导还原思路

循环移位的逆操作是“反向循环移位相同位数”:

加密逻辑:向右循环移位3位

还原逻辑:向左循环移位3位(或向右循环移位5位,因为8位字符的循环移位,移n位和移8-n位反向)。

步骤3:编写Python还原脚本

# 循环移位加密还原脚本(向右移3位 → 还原:向左移3位)
target =&nbsp;"kL`f9]vM"&nbsp;&nbsp;# 从IDA提取的目标字符串
shift =&nbsp;3&nbsp;&nbsp;# 移位位数(和加密时一致)
flag =&nbsp;""

for&nbsp;c&nbsp;in&nbsp;target:
&nbsp; &nbsp;&nbsp;# 向左循环移位3位:(c << 3) | (c >> 5)
&nbsp; &nbsp;&nbsp;# 先把字符转成ASCII码(ord(c)),再进行移位操作
&nbsp; &nbsp; original = (ord(c) << shift) | (ord(c) >> (8&nbsp;- shift))
&nbsp; &nbsp; flag +=&nbsp;chr(original)

print("正确Flag:", flag)

步骤4:验证结果

运行脚本,得到正确Flag,输入程序验证即可。如果是普通移位(非循环),还原时直接“反向移位”即可(比如加密时向右移3位,还原时向左移3位,用ord(c) – 3)。

  • 类型3:简单替换加密(字符映射)

简单替换加密的核心逻辑是“用一个字符替换另一个字符”(比如’a’→’x’、’b’→’y’),加密时会有一个“替换表”(字符映射表),还原时用“反向替换表”即可。

步骤1:用IDA分析加密逻辑

看一个简单替换加密的伪代码:

int&nbsp;main() {
&nbsp; &nbsp; char&nbsp;input[20];
&nbsp; &nbsp; char target[] =&nbsp;"zqf72@"; // 加密后的目标字符串
&nbsp; &nbsp; // 替换表:key1中的字符 → 对应key2中的字符(加密映射)
&nbsp; &nbsp; char key1[] =&nbsp;"abcdef1234@";
&nbsp; &nbsp; char key2[] =&nbsp;"xyzqrf7890#";

&nbsp; &nbsp; printf("请输入Flag:");
&nbsp; &nbsp; gets(input);

&nbsp; &nbsp; // 加密逻辑:按替换表替换每个字符
&nbsp; &nbsp;&nbsp;for&nbsp;(int&nbsp;i =&nbsp;0; i < strlen(input); i++) {
&nbsp; &nbsp; &nbsp; &nbsp; // 找到input[i]在key1中的位置,替换成key2中对应位置的字符
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;for&nbsp;(int&nbsp;j =&nbsp;0; j < strlen(key1); j++) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(input[i] == key1[j]) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;input[i] = key2[j];
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;break;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;if&nbsp;(strcmp(input, target) ==&nbsp;0) {
&nbsp; &nbsp; &nbsp; &nbsp; printf("Flag正确!\n");
&nbsp; &nbsp; }&nbsp;else&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; printf("Flag错误!\n");
&nbsp; &nbsp; }
&nbsp; &nbsp;&nbsp;return0;
}

提取关键信息:

① 加密算法:简单替换;

② 加密映射表:key1→key2(比如’a’→’x’、’b’→’y’);

③ 目标字符串:”zqf72@”。

步骤2:推导还原思路

加密逻辑:key1[i] → key2[i](输入字符是key1中的字符,替换成key2中的字符)。

还原逻辑:key2[i] → key1[i](目标字符是key2中的字符,替换成key1中的字符)——构建反向映射表即可。

步骤3:编写Python还原脚本

# 简单替换加密还原脚本
target =&nbsp;"zqf72@"# 从IDA提取的目标字符串
# 加密映射表:key1→key2
key1 =&nbsp;"abcdef1234@"
key2 =&nbsp;"xyzqrf7890#"

# 构建反向映射表:key2的字符 → key1的字符(还原用)
replace_dict = {}
for&nbsp;k1, k2&nbsp;inzip(key1, key2):
&nbsp; &nbsp; replace_dict[k2] = k1

flag =&nbsp;""
# 遍历target,按反向映射表替换
for&nbsp;c&nbsp;in&nbsp;target:
&nbsp; &nbsp; flag += replace_dict[c]

print("正确Flag:", flag)

步骤4:验证结果

运行脚本得到Flag,输入程序验证即可。如果替换表是随机生成的,只要从IDA中找到完整的key1和key2,就能构建反向映射表还原。

三、实战小任务:综合加密程序还原(巩固练习)

光练单一加密类型不够,我们用一个“异或+移位”的综合加密程序,练习完整的还原流程:

  1. 用IDA分析综合加密程序的伪代码
int&nbsp;main() {
&nbsp; &nbsp; char&nbsp;input[20];
&nbsp; &nbsp; char target[] =&nbsp;"pR$j3*";
&nbsp; &nbsp; char key =&nbsp;0x0F;
&nbsp; &nbsp;&nbsp;int&nbsp;shift =&nbsp;2;

&nbsp; &nbsp; printf("请输入Flag:");
&nbsp; &nbsp; gets(input);

&nbsp; &nbsp; // 综合加密:先异或key,再向左移2位
&nbsp; &nbsp;&nbsp;for&nbsp;(int&nbsp;i =&nbsp;0; i < strlen(input); i++) {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;input[i] ^= key; // 第一步:异或
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;input[i] <<= shift; // 第二步:向左移2位
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;if&nbsp;(strcmp(input, target) ==&nbsp;0) {
&nbsp; &nbsp; &nbsp; &nbsp; printf("Flag正确!\n");
&nbsp; &nbsp; }&nbsp;else&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; printf("Flag错误!\n");
&nbsp; &nbsp; }
&nbsp; &nbsp;&nbsp;return0;
}
  1. 自己推导还原思路,编写脚本

提示:还原顺序要和加密顺序相反(先还原移位,再还原异或)——加密是“异或→移位”,还原是“反向移位→异或”。自己动手写脚本,再对照下面的参考脚本检查:

# 综合加密还原脚本(异或+移位)
target =&nbsp;"pR$j3*"
key =&nbsp;0x0F
shift =&nbsp;2
flag =&nbsp;""

for&nbsp;c&nbsp;in&nbsp;target:
&nbsp; &nbsp;&nbsp;# 第一步:还原移位(向左移2位 → 向右移2位)
&nbsp; &nbsp; shift_back =&nbsp;ord(c) >> shift
&nbsp; &nbsp;&nbsp;# 第二步:还原异或
&nbsp; &nbsp; original = shift_back ^ key
&nbsp; &nbsp; flag +=&nbsp;chr(original)

print("正确Flag:", flag)

四、还原过程中最容易踩的4个坑

  • 坑1:还原顺序搞反——加密是“步骤A→步骤B”,还原必须是“还原步骤B→还原步骤A”(比如先异或再移位,还原要先移位再异或),顺序错了必出错。
  • 坑2:密钥/移位位数搞反——比如加密时是“异或0x13”,还原时写成“异或0x31”,一定要从IDA中准确提取关键参数。
  • 坑3:字符编码错误——忘记用ord()/chr()转换字符和ASCII码,直接对字符进行运算,导致脚本报错。
  • 坑4:循环边界问题——还原时遍历的字符长度和加密时不一致(比如target长度是8,还原时少遍历1个),导致Flag缺失字符。

五、下期预告&福利时间

今天我们搞定了3种高频字符串加密的还原方法,还学会了编写Python还原脚本——这是Reverse基础题的核心,掌握后就能独立解大部分新手Reverse题了!下期我们将进入系列最后一期:实战技巧大整合——比赛答题策略+常见题型总结,帮你整合所有知识点,形成完整的解题思维,轻松应对CTF比赛中的Reverse题型!

如果今天的内容对你有帮助,别忘了点赞、在看,转发给一起学CTF的小伙伴

全套CTF学习资源,也可以在下面蓝色链接拿!

CTF学习资源,限时免费领取

想要的兄弟,关注我发送CTF入门,直接免费分享!前提是你得沉下心练,别拿了资料就吃灰,咱学技术,贵在坚持!

给大家准备了2套关于CTF的教程,一套是涵盖多个知识点的专题视频教程:

另一套是大佬们多年征战CTF赛事的实战经验,也是视频教程:

可以截图或者长按识别、扫码添加找我拿

龙哥网络安全

扫码添加领取

点击蓝字

关注我

计算机#计算机网安#网络安全#渗透测试#CTF#CTF比赛#赛事#计算机专业大学规划#网安零基础怎么入学#大学生


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:龙哥网络安全 龙哥网络安全《CTF Reverse模块系列分享(四):核心实战!字符串加密还原,编写脚本直接拿Flag》

25龙信杯服务器 网络安全文章

25龙信杯服务器

文章总结: 作者复盘25龙信杯服务器赛题,指出因过早纠结重构界面而忽视数据库本质,导致解题卡顿,提醒选手聚焦数据层。 综合评分: 72 文章分类: CTF,实战
评论:0   参与:  0