[1]ScreenShot_2026-04-01_101146_494.png
今天这一题主要看静态代码的加密过程
ScreenShot_2026-04-01_084733_935.png
无壳
ScreenShot_2026-04-01_084856_154.png
64位elf,试试放到ubantu运行
ScreenShot_2026-04-01_085042_521.png
不行,那就看看静态代码就好了,放ida64
ScreenShot_2026-04-01_101520_293.png
主函数没什么,但是里面的dcry()函数比较特别,是加密函数
ScreenShot_2026-04-01_101216_846.png
这是decry函数的前半段,主要是说把密钥key和密文拼出来
ScreenShot_2026-04-01_103253_415.png
key1和key3的值在这里

*(_QWORD *)src = 357761762382LL;十六进制:0x534C43444E
小端序是4E 44 43 4C 53 00,对应字符:N D C L S
同理,v9 = "hadow"
text = key3+v9="killshadow"
key = key1 = "ADSFK"
key = key1 + src = "ADSFKNDCLS"
v5 = strlen(key) = 10
for循环:大写转小写 key = "adsfkndcls"
while循环:一个一个字符输入:\n结束,空格跳过,非小写执行逻辑,大小写都执行同样的加密

所以我们有了密钥key,密文text,又知道循环输入的字符不是大写就是小写,所以可以爆破用明文算出密文,和text一致的就是正确的明文flag

exp:

target = "killshadow"  # 我们已经推导出的目标密文
key = "adsfkndcls"     # 我们已经推导出的完整小写密钥
flag = ""              # 用来存放猜出来的结果

# 遍历密文中的每一个字符
for i in range(len(target)):
    c = target[i]  # 当前的密文字符
    k = key[i]     # 当前的密钥字符(因为两个字符串长度刚好都是10,都不需要用 % 取模了)
    
    # 穷举测试小写字母 a 到 z(对应的 ASCII 码是 97 到 122)
    for v1 in range(97, 123):
        
        # 完全照搬ida C 语言源码里的加密公式!
        # 唯一的区别是用 ord() 把字母转成数字算,再用 chr() 把数字转回字母
        encrypted_char = chr((v1 - 39 - ord(k) + 97) % 26 + 97)
        
        # 如果这个字母加密后的结果,刚好等于目标密文
        if encrypted_char == c:
            flag += chr(v1) # 把猜对的字母加到 flag 里
            break           # 猜对了就跳出内部循环,继续猜下一个字母

print("解密得到的 Flag 是:", flag)