[ACTF新生赛2020]usualCrypt-BUUCTF
查壳,莫得,32位
载入 IDA,查看主函数
- sub_401080 是一个加密函数,传入用户输入的 v8,操作过后返回 v5
- while 实现了一个字符串比较的过程,将 v5 与 byte_40E0E4 的每一位作比较
所以先去看看 sub_401080 干了些什么
不难看出主体部分进行的操作是 base64 加密,需要注意的是,数据在加密前先进行了 sub_401000(),并且在返回的时候进行了 sub_401030()
sub_401000 函数如下
是将字符串进行了一些位置上的变换,byte_40E0A0 和 byte_40E0AA 看起来是两个数组,但地址是连在一起的,所以当作一个看就可以
从下标为 6 开始到下标为 15,往后偏移了 10 位,可以据此求解出对应的 base64 码表
接着看函数返回时进行的 sub_401030 操作
其实就是将字符串大小写进行转换,小写字母变为大写字母,大写字母变为小写字母
回到主函数,看到 while 循环比较部分的比较标准 byte_40E0E4
也就是说这个就是函数 sub_401080 的返回值,也就是我们输入的内容经过变表base64加密后再转换了大小写后的样子,据此可以写出 exp:
#include <bits/stdc++.h>
using namespace std;
int num = 10;
char str[] = "zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9";
char String[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int main() {
int len = strlen(str);
for (int i = 0; i < len; i++)
if (str[i] >= 'a' && str[i] <= 'z') str[i] -= 32;
else if (str[i] >= 'A' && str[i] <= 'Z') str[i] += 32;
for (int result = 6; result < 15; result++) {
int v1 = String[result];
String[result] = String[result + num];
String[result + num] = v1;
}
cout << str << endl << String;
return 0;
}
- 得到 base64 码表为:ABCDEFQRSTUVWXYPGHIJKLMNOZabcdefghijklmnopqrstuvwxyz0123456789+/
- 加密后的字符串为:ZmxhZ3tiGNXlXjHfaDTzN2FfK3LycRTpc2L9
在线自定义 base64 解密:http://web.chacuo.net/netbasex
flag{bAse64_h2s_a_Surprise}