[GUET-CTF2019]encrypt 题解

news/2025/2/12 5:12:54/

本题是输入了一个字符串,进行了rc4加密,和魔改的base64加密

RC4算法初始化函数

RC4加密过程

魔改的base64加密

最后加密的字符串是byte_602080

我们可以将byte_602080提取出来,下面是提取数据的IDC脚本,得到了密文

#include<idc.idc>
static main(){Message("\nStart:-------------------------------------------------------------------\n");auto addr=0x602080;  auto i=0;auto length=51  ;for(i=addr;i<=addr+length;i++){Message("0x%02x,",Byte(i));}Message("End:-----------------------------------------------------------------------\n");
}

然后先进行base64解密

然后进行RC4解密

我们RC4解密时候,不编写整个RC4加密算法的解密脚本

我们知道RC4加密算法最后是要得到一个数据和明文进行异或

*(_BYTE *)(i + a2) ^= LOBYTE(v9[(unsigned __int8)(v7 + v8)]);

该数据 xor 明文=密文

密文 xor 该数据 =明文

我们如果能得到每次循环的这个数据,与base64解密得到结果(RC加密后的密文)依次异或就能得到明文

 这个需要远程动态调试,我们需要在88次循环中截取到每次最后进行异或的这个数据

观察这一句对应的汇编代码,xor edx,esi

发现此时edx存储的正是这个要和明文异或的数据

我们将这个文件放在Linux虚拟机中进行动态调试

编写脚本自动化调试提取每次edx的值

 这是使用脚本自动化动态调试得到的每次的数据

编写wp

#include <stdio.h>
#include <string.h>int main() {char data[] = {0x5a, 0x60, 0x54, 0x7A, 0x7A, 0x54, 0x72, 0x44, 0x7C, 0x66, 0x51, 0x50, 0x5B, 0x5F, 0x56, 0x56, 0x4C, 0x7C, 0x79, 0x6E, 0x65, 0x55, 0x52, 0x79, 0x55, 0x6D, 0x46, 0x6B, 0x6C, 0x56, 0x4A, 0x67, 0x4C, 0x61, 0x73, 0x4A, 0x72, 0x6F, 0x5A, 0x70, 0x48, 0x52, 0x78, 0x49, 0x55, 0x6C, 0x48, 0x5C, 0x76, 0x5A, 0x45, 0x3D};char flag[255];memset(flag, 0, sizeof(flag));int j = 0;char l[] = {0x10, 0x59, 0x9C, 0x92, 0x06, 0x22, 0xCF, 0xA5, 0x72, 0x1E, 0x45, 0x6A, 0x06, 0xCB, 0x08, 0xC3, 0xE4, 0x49, 0x5A, 0x63, 0x0C, 0xDF, 0xF6, 0x5F, 0x08, 0x28, 0xBD, 0xE2, 0x10, 0x15, 0x1F, 0x6E, 0xAA, 0x5A, 0xCA, 0xEC, 0x80, 0xAF, 0x9B, 0x16, 0xBB, 0x3D, 0x13, 0x2F, 0x6A, 0xA4, 0xC7, 0x2E, 0xBC, 0x4B, 0x60, 0x9A, 0xAF, 0xE9, 0xCE, 0xDA, 0x67, 0x39, 0xBA, 0x3B, 0x85, 0xEB, 0xD2, 0x6B, 0xAB, 0x06, 0x6B, 0x10, 0x57, 0x2C, 0x88, 0x70, 0xF7, 0x4F, 0xAA, 0x7F, 0x12, 0x47, 0xD6, 0xDE, 0x74, 0xB2, 0x1D, 0xA4, 0xD7, 0x76, 0x9A, 0xE0};for (int i = 0; i < sizeof(data); i += 4) {flag[strlen(flag)] = (((data[i] - 0x3D) & 0x3F) << 2) | (((data[i + 1] - 0x3D) & 0x30) >> 4);flag[strlen(flag)] = (((data[i + 1] - 0x3D) & 0x0F) << 4) | (((data[i + 2] - 0x3D) & 0x3C) >> 2);flag[strlen(flag)] = ((data[i + 3] - 0x3D) & 0x3F) | ((data[i + 2] - 0x3D) & 0x03) << 6;}for (int i = 0; i < strlen((const char *)flag); i++) {flag[i] ^= l[j++];}printf("%s", flag);return 0;
}


http://www.ppmy.cn/news/68683.html

相关文章

如何判断自己是否适合做项目管理?

如何转做项目管理&#xff1f;如何判断自己是否适合做项目管理&#xff1f;我们可以从项目管理的思维、能力、工具、书籍阅读四个方面入手—— 1.项目管理的思维 &#xff08;1&#xff09;系统思考 项目管理需要从一个系统的角度来看待问题&#xff0c;将复杂的项目分解为小…

文本三剑客之~~~sed命令

目录 sed概念sed 的工作流程&#xff1a;命令格式&#xff1a;常用选项&#xff1a;常用操作&#xff1a; 示例&#xff1a;打印删除替换&#xff1a;插入&#xff1a;剪切复制将字符替换位置 sed概念 sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提…

带你了解家居智能的心脏:物联网关

本文将介绍家庭物联网关的相关内容&#xff0c;将明白物联网关在家庭这个场景当中的应用。现在市面上各种各样的智能家居的家电或者其他设备非常多&#xff0c;那么这就需要一个智能的设备去对所有的家电进行管控。这样一个设备就是家庭智能网关&#xff0c;家庭物联网关是家居…

​力扣解法汇总970. 强整数

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给定三个整数 x 、 y 和 bound &#xff0c;返回 值小于或等于 bound 的所有 强…

FE_Vue学习笔记 插槽 slot

插槽分为匿名插槽、具名插槽、作用域插槽。子组件中&#xff1a; 匿名插槽只能有一个&#xff1b;可以有多个具名插槽&#xff1b;作用域插槽中可以有匿名插槽和具名插槽。 当项目中一个组件可以多次复用时&#xff0c;我们可以把这个组件封装成单独的.vue文件&#xff0c;从…

Java 17 用户采用率在一年内增长了 430%

New Relic 最新发布了一份 “2023 年 Java 生态系统状况报告”&#xff0c;旨在提供有关当今 Java 生态系统状态的背景和见解。该报告基于从数百万个提供性能数据的应用程序中收集的数据&#xff0c;对生产中使用最多的版本、最受欢迎的 JDK 供应商、容器的兴起等多方面进行了调…

伙伴匹配推荐接口的优化策略【优先队列+多线程分批处理,java实现】

文章目录 接口背景接口问题说明优化策略用户匹配度计算接口改进与测试说明改进前改进一&#xff08;使用优先队列存储编辑距离较小的n个元素&#xff09;改进二&#xff08;使用优先队列存储编辑距离较小的n个元素数据分批查询、分批处理&#xff09;改进三&#xff08;使用优先…

初阶数据结构之带头+双向+循环链表增删查实现(三)

文章目录 [TOC](文章目录) 前言一、带头双向循环链表的初始化1.1带头双向循环链表的结构体定义1.2初始化代码的实现 二、带头双向循环链表的增功能实现2.1头插代码的实现2.2尾插代码的实现 三、带头双向循环链表的打印功能实现3.1打印代码的实现 四、带头双向循环链表删功能实现…