查壳:
64位,没什么信息,进IDA:
能看到有三个加密,都通过的话就是正确的flag,也给了我们最后的密文"EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG"
由于我们是要返回flag那么我倒回去看加密,先看encode_three:
逻辑加密,再看encode_two:
打乱字符串,再看encode_one:
base64加密?不确定,看看码表:
base64加密妥了。
总结下思路,对flag进行base64的加密后,进行字符串的打乱,最后逻辑加密。(这逻辑加密有点绕,直接考虑爆破了,不想逆推了都)
上脚本:
int main(){
string Des = "EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG";
string flag = "";
for (int i = 0; i < Des.size(); ++i ){
for (int j = 32; j <= 127; j++) {
if ( j > 90 || j <= 64)
{
if ( j <= 96 || j > 122 )
{
if (j <=47 || j > 57 ) {
if (j == Des[i])flag += char(j);
}
else {
if ((j - 48 + 3) % 10 + 48 == Des[i])
flag += char(j);
}
}
else
{
if((j - 97 + 3) % 26 + 97 == Des[i])
flag += char(j);
}
}
else
{
if((j - 65 + 3) % 26 + 65 == Des[i])
flag += char(j);
}
}
}
cout << flag << endl;
return 0;
}
得到BjYjM2Mjk4NzMR1dIVHs2NzJjY0MTEzM2VhMn0=zQ3NzhhMzhlOD。
打乱顺序那个,我看了其他大佬的文章,都是利用python来写的(不得不说python提供的[]也特别优秀,这里我就不用那玩意了,我感觉我解释不清楚那玩意)上我自己的脚本:
我们再来看看
第一个strncpy是将al(也就是原始flag经过加密后的字符串)下标为26到最后一个字符的所有字符复制到a3下标为0到最后一个字符
第二个strncpy是将al(也就是原始flag经过加密后的字符串)下标为0到最后一个字符的所有字符复制到a3下标为13到最后一个字符(这里不会出现越界的问题,是保证了同等长度了)
也就说a3 0~12的字符没有被覆盖,而13到最后的字符重新被覆盖了。可以利用这个特点,去还原原本的字符串:
int main(){
string flag = "BjYjM2Mjk4NzMR1dIVHs2NzJjY0MTEzM2VhMn0=zQ3NzhhMzhlOD";
string flag1 = "";
string flag2 = "";
string flag3 = "";
string flag4 = "";
int cn = 0;
for (int i = 13; i < 26; i++) {
flag1 += flag[i];
}
for (int i = 39; i < flag.size(); i++) {
flag2 += flag[i];
}
for (int i = 0; i < 13; i++) {
flag3 += flag[i];
}
for (int i = 26; i < 26+13; i++) {
flag4 += flag[i];
}
string ans = flag1+flag2+flag3+flag4;
cout << ans << endl;
return 0;
}
得到R1dIVHs2NzJjYzQ3NzhhMzhlODBjYjM2Mjk4NzM0MTEzM2VhMn0=
拿去base64解密:
Des = 'R1dIVHs2NzJjYzQ3NzhhMzhlODBjYjM2Mjk4NzM0MTEzM2VhMn0='
print(base64.b64decode(Des))