P1

抽象题目

主函数内有三个需要注意的点,首先是base64encode,这是个标准b64加密函数,码表也是标准的,但就是解不出来,为什么呢?

关键点就在这个debug内

可以看到,这里利用了srand生成了随机数,并用std::random_shuffle函数对base64的码表进行了打乱

有关std::random_shuffle

std::random_shuffle、std::shuffle - cppreference.com

(沟槽的被cpp17移除了)

可以看到随机打乱的随机数来源就是srand

那么到这里逻辑就清晰了——这是一个乱序码表b64,因为srand的特性,同样种子生成的随机数序列也是一样的,所以我们只需对标准码表进行同样打乱操作再进行b64解密即可

exp:

#include <stdio.h>
#include <iostream> 
#include <algorithm>
#include <random>
using namespace std;
//码表生成
​
int main()
{
    unsigned int s;
    s=0;
    std::srand(s);
    char table[64]={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K','L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V','W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g','h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r','s', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2','3', '4', '5', '6', '7', '8', '9', '+', '/'};
    std::random_shuffle<char *>(table,&table[63]);
    for(int i = 0;i <= 63;i++)
    {
        printf("%c",table[i]);
    }
    return 0;
}
​

解密::

import base64
code = "aUiBDdopSQVOFlfLnTNrv4sj+MJW3g2Cy5IZk6APYt9RGwqm/8H7eKcx1EzbX0hu"
flag = "r6lrnKTo27T5FsDxfB+ElZMIlBQZMAS/MB6AlB4klBnelZFeFrTACn=="
coder = str.maketrans(code, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789==")
print(len(base64.b64decode("r6lrnKTo27T5FsDxfB+ElZMIlBQZMAS/MB6AlB4klBnelZFeFrTACn==".encode())))
print(flag.translate(coder))
print(base64.b64decode(flag.translate(coder)))

P2

沟槽的RC4TLS