CTF-reverse-simpleRE(base64变表逆向)

ops/2024/10/18 12:34:19/

题目链接

NSSCTF | 在线CTF平台


题目详情

[HUBUCTF 2022 新生赛]simple_RE


解题报告

下载得到的文件使用ida64分析,如果报错就换ida32,得到分析结果,有main函数就先看main

main函数分析

main函数的逻辑看下来十分简单,因此关键就要看这个加密函数了

这里字符串a5mc58bphliax7j显然就是密文,双进查看内容是

5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8==

sub_401570函数分析

看下来似乎是很复杂的加密,但有经验的话从特征不难识别出来是base64加密,比如红框里的三个经典等号(ASCII码是61)和循环里的位移操作

当然最容易一锤定音是base64的还是aQvejafhmuyjbac这个数组,双击跟进看内容,这字符一看就base64了,而且是魔改换表版本

base64与base64换表

标准的base64加解密所用表是【ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/】刚好64个字符

如果对标准表中的字符进行顺序替换,称之为base64换表

  • 对于标准表的base64,可以直接用编程语言提供的解密函数直接解密或者使用在线网站解密等
  • 对于换表base64,需要多做一步映射,将换表的字符映射回标准表,然后再进行解密

怎么映射呢?拿本题来举例,换表是【qvEJAfHmUYjBac+u8Ph5n9Od17FrICL/X0gVtM4Qk6T2z3wNSsyoebilxWKGZpRD

密文是【5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8==

密文中第一个字符是5,在换表中的索引(下标)为19,而在标准表中,索引19处的字符为【'T'

密文中第二个字符是M,在换表中的索引(下标)为37,而在标准表中,索引19处的字符为【'l'

以此类推,完成映射

映射可以通过自写循环来实现,也可以直接使用字符串函数translate,下面给出了两种方法的脚本来解决本题

EXP

自写循环映射

import base64 #导入base64模块用于解密
s1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' #标准表
s2 = 'qvEJAfHmUYjBac+u8Ph5n9Od17FrICL/X0gVtM4Qk6T2z3wNSsyoebilxWKGZpRD' #base64换表
en_text = '5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8==' #密文map_text = '' #用于存放密文通过换表映射回标准表的字符
for i in en_text:if(i != '='): #注意密文中存在等号的情况下,不需要替换!idx = s2.index(i) #获取每个密文的字符在换表中的索引map_text += s1[idx] #取出标准表中的该索引的字符,就是正常base64加密的密文else:map_text += i
print(map_text) #可以先看看标准表base64加密的密文
print(base64.b64decode(map_text)) #直接使用提供的base64解密函数,获得明文,就是flag

库函数映射

import base64 #导入base64模块用于解密
s1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' #标准表
s2 = 'qvEJAfHmUYjBac+u8Ph5n9Od17FrICL/X0gVtM4Qk6T2z3wNSsyoebilxWKGZpRD' #base64换表
en_text = '5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8==' #密文map = str.maketrans(s2, s1) #用str类中的maketrans建立映射,注意第一个参数是需要映射的字符串,第二个参数是映射的目标
map_text = en_text.translate(map) #映射实现替换密文,替换前是base64换表加密,替换后则是base64标准表加密
print(map_text) #可以先看看标准表加密的密文
print(base64.b64decode(map_text)) #直接使用提供的base64解密函数,获得明文,就是flag


http://www.ppmy.cn/ops/9999.html

相关文章

【机器学习】重塑汽车设计与制造:实例与代码探索

机器学习重塑汽车设计与制造 一、机器学习在汽车设计中的应用二、机器学习在智能制造与生产中的应用 在数字化浪潮的推动下,机器学习技术正逐步成为汽车行业的创新引擎。从概念设计到智能制造,机器学习正以其独特的优势助力汽车产业的革新与发展。本文将…

基于Springboot的网课管理系统

基于SpringbootVue的网课管理系统的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 课程表 论坛交流 学校公告 后端 学生管理 教师管理 班级管理 课程分类管理…

第52篇:算法的硬件实现<三>

Q:本期我们介绍二进制搜索算法电路,用于查找某个数据在数组中的位置。 A:基本原理:从数组的中间元素开始,如果给定值和中间元素的关键字相等,则查找成功;如果给定值大于或者小于中间元素的关键…

了解边缘计算,在制造行业使用边缘计算。

边缘计算是一种工业元宇宙技术,可以帮助组织实现其数据的全部潜力。 处理公司的所有数据可能具有挑战性,而边缘计算可以帮助公司更快地处理数据。在制造业中,边缘计算可以帮助进行预测性维护和自动驾驶汽车操作等工作。 什么是边缘计算? …

npm 打包后自动压缩成zip文件

在package.json里面的scripts下面的build添加 powershell -NoProfile -ExecutionPolicy Unrestricted -Command ./zip.ps1 新的build就是 "build": "vite build && esno ./build/script/postBuild.ts && powershell -NoProfile -ExecutionP…

AJAX——封装_简易axios

1.简易axios_获取身份列表 需求:基于Promise XHR 封装 myAxios函数,获取省份列表展示 步骤: 1.定义 myAxios函数,接收配置对象,返回Promise对象 2.发起XHR请求,默认请求方法为GET 3.调用成功/失败的处…

个人网站的SEO优化系列——如何实现搜索引擎的收录

如果你自己做了一个网站,并且想让更多的人知道你的网站,那么无非就是两种途径 一、自己进行宣传,或者花钱宣传 二、使用搜索引擎的自然流量 而如果搜索引擎都没有收录你的站点,别说是自然流量,就算是使用特定语句【sit…

如何使用渐变块创建自定义聊天机器人

如何使用渐变块创建自定义聊天机器人 文章目录 如何使用渐变块创建自定义聊天机器人一、介绍二、参考示例1、一个简单的聊天机器人演示2、将流式传输添加到您的聊天机器人3、喜欢/不喜欢聊天消息4、添加 Markdown、图像、音频或视频 一、介绍 **重要提示:**如果您刚…