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