[羊城杯 2020]easyre

查壳:

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))

拿到NSSCTF{672cc4778a38e80cb362987341133ea2}

posted @ 2023-05-14 10:45  TFOREVERY  阅读(130)  评论(0编辑  收藏  举报