[ACTF新生赛2020]usualCrypt 1

发布时间 2023-05-05 22:08:09作者: TFOREVERY

日常查壳:

32位,运行看看:

(有点嚣张,但不多),任意输入退出。

进IDA看主函数:

进入主函数后,首先是读入一个字符串,然后是对该字符串进行sub_401080方法加密,最后是对比。

那么我们跟进方法,看看是什么加密类型:

第一眼下去还多了一个方法sub_401000(),跟进看看:

不多说,检查这两的内存:

可以看到这两是在一个内存段中的,首先先进行标砖码的交换也就是sub_401000()方法,上脚本:

int main(){
    string ba = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    for (int i = 6; i < 15; i++) {
        char a = ba[i];
        ba[i] = ba[i+10];
        ba[i+10] = a;
    }
    cout << ba;
    return 0;
}

得到新的编码“ABCDEFQRSTUVWXYPGHIJKLMNOZabcdefghijklmnopqrstuvwxyz0123456789+/”

根据新的编码进行加密,然后返回加密的密文:跟“zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9”比较。也就说“zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9”就是加密后的密文,所以用它来解密就好了,这里注意,解密也是用新的编码来解密:

上脚本:

import base64

# 自定义base64编码解码
Str = list("ABCDEFQRSTUVWXYPGHIJKLMNOZabcdefghijklmnopqrstuvwxyz0123456789+/")  # 自定义base64码
model = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"  # 标准base64码
Str = ''.join(Str)
enc = "zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9".swapcase()
dec = ""
for i in range(len(enc)):
    dec += model[Str.find(enc[i])]
print(base64.b64decode(dec))

拿到flag{bAse64_h2s_a_Surprise}收工。