[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}

posted @ 2021-11-20 15:44  Moominn  阅读(282)  评论(0编辑  收藏  举报