日常查壳:
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))