IDA32打开
审计:
发现没有主函数 shift+f12查找flag双击之后找到sub_400BC8()进入
发现是主函数 f5
输入了v3之后 先进行了sub_41A6E0(v3)处理
没有找到关键信息(咳咳没看懂) 继续跟进
发现又进行了 sub_4009DC(v3)处理
先调用了sub_400864()继续跟进
发现两个里面都是256的for循环,并且第一个只进行了赋值判断,第二个进行了取余操作还都是256的循环
可以推出为RC4加密 第一个为初始化 第二个为加密跟进aFlag1233213211发现
aFlag1233213211[ ]值为flag{123321321123badbeef012}
回到主函数继续下一步跟进 sub_400550()
进去aZyxwvutsrqponm发现是base64加密 密码表不是默认的
回到主函数看15行
if ( sub_41A1E0(v2, "ScDZC1cNDZaxnh/2eW1UdqaCiJ0ijRIExlvVEgP43rpxoxbYePBhpwHDPJ==") )
得出 是将输入的v3的值先进行了RC4加密然后base64加密然后与v2进行比较相同则输出flag
思路:
(最先调用的sub_41A6E0(v3)应该是strlen()的作用 不重要)
将base64进行换表之后把
ScDZC1cNDZaxnh/2eW1UdqaCiJ0ijRIExlvVEgP43rpxoxbYePBhpwHDPJ==
进行base64解密 然后再进行RC4解密就能得到flag
难点在于 要知道RC4加密和base64加密
脚本:
flag{RC_f0ur_And_Base_s1xty_f0ur_Encrypt_!}
第一个(需要Crypto.Cipher (可以百度搜一下 或者用第二个脚本))
import base64
from Crypto.Cipher import ARC4
key = "ScDZC1cNDZaxnh/2eW1UdqaCiJ0ijRIExlvVEgP43rpxoxbYePBhpwHDPJ=="
string1 = "ZYXWVUTSRQPONMLKJIHGFEDCBAabcdefghijklmnopqrstuvwxyz/+9876543210" # string1表示更换后的码表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" # string2表示原始码表
Str = base64.b64decode(key.translate(str.maketrans(string1, string2))) # Base64解密,bytes型
aFlag1233213211 = "flag{123321321123badbeef012}"
flag = ARC4.new(bytes(aFlag1233213211, encoding='utf-8')).decrypt(Str)
print(flag)
第二个 (这个是手动RC4解密 呜呜呜太难了。。。。。。。。。。。。。。。。)
import base64
flag = ""
key = "ScDZC1cNDZaxnh/2eW1UdqaCiJ0ijRIExlvVEgP43rpxoxbYePBhpwHDPJ=="
string1 = "ZYXWVUTSRQPONMLKJIHGFEDCBAabcdefghijklmnopqrstuvwxyz/+9876543210" # string1表示更换后的码表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" # string2表示原始码表
print("Base64还原: ", key.translate(str.maketrans(string1, string2))) # 将 key 还原成初始码表加密后的结果
Str = base64.b64decode(key.translate(str.maketrans(string1, string2))) # Base64解密,bytes型
print("Base64解密: ", Str)
byte_4A0860 = []
aFlag1233213211 = "flag{123321321123badbeef012}"
# rc4_init
for i in range(256):
byte_4A0860.append(i)
v4 = 0
v3 = 0
for j in range(256):
v5 = byte_4A0860[j]
v3 = (v5 + v3 + ord(aFlag1233213211[int(j % len(aFlag1233213211))])) & 0xff
byte_4A0860[j] = byte_4A0860[v3]
byte_4A0860[v3] = v5
v4 = v4 + 1
if v4 >= len(aFlag1233213211):
v4 = 0
print("s_box:", end=" ")
for j in range(256):
print(byte_4A0860[j], end=" ")
print()
# rc4_crypt
v4 = 0
v3 = 0
for k in range(len(Str)):
v3 = (v3 + 1) & 0xff
v4 = (byte_4A0860[v3] + v4) & 0xff
v5 = byte_4A0860[v3]
byte_4A0860[v3] = byte_4A0860[v4]
byte_4A0860[v4] = v5
flag += chr(Str[k] ^ byte_4A0860[(byte_4A0860[v3] + byte_4A0860[v4]) & 0xff])
print(flag)