首页
社区
课程
招聘
[原创]巳时·绿光幽语
发表于: 2天前 67

[原创]巳时·绿光幽语

2天前
67

附件 题目.rar 解压后得到 题目.exe。对 EXE 做字符串和结构分析,可以看到 python313.dllbase_library.zipPYZ.pyz 等特征,判断为 PyInstaller 打包程序。

用 PyInstaller 的归档读取器提取后,发现主脚本 main 非常短,反序列化后等价于:

import sys
sys.exit(0)

但实际运行程序会提示:

提示,需要还原的代码

def my_function():
    print("恭喜成功!")

请输入key还原代码(请输入6个字符)

说明真正逻辑不在常规入口脚本里,而是在打包携带的库中。

定位库中逻辑

python313.dll 中搜索 my_function,能在偏移 0x4dace9 附近看到 marshal code object 片段。继续向前反序列化 frozen module,可以在偏移 0x4d00e0 处得到被修改过的 frozen os 模块。

os 模块尾部被追加了题目逻辑。关键字节码反汇编后可还原为:

x = 0
while x < 20:
    def my_function():
        print(666)

    try:
        x += 1

        buffer = b''.join([
            b'\xb3\xda\xc5\xb2\xf1\xef\xba\xe9\xd9\xbc\xc9\xd5\xbd\xf3\xd4\xbd',
            b'\xea\xcd\xb0\xdb\xca\xb2\xcf\xd1\xb1\xee\xf6\xb2\xf5\xd4X_',
            b'103u8,\n3 ;6!<:;}',
            b"|oX_\\%'<;!}w\xb3\xd4\xf8\xb0",
            b'\xc3\xc9\xb3\xdd\xc5\xb0\xdf\xca\xba\xe9\xd4w|X_\xbd',
            b'\xfa\xe2\xbd\xeb\xc6\xb0\xd0\xf0>0,\xbd\xea\xcd\xb0\xdb',
            b'\xca\xb1\xee\xf6\xb2\xf5\xd4\xba\xe9\xdd\xbd\xfa\xe2\xbd\xeb\xc6',
            b'\xb0\xd0\xf0c\xb1\xed\xff\xb0\xf8\xc2\xb2\xf9\xf3\xba\xe9\xdc',
        ])
        w = bytes(i ^ 0x55 for i in buffer)
        print(w.decode('utf-8'))

        key = input()
        if len(key) != 6:
            continue

        b_key = key.encode()

        c = b'\xecbmucryb6tcr*c\x03ucryb6tCr\x1eb'
        buf = bytes(c[i] ^ b_key[i % len(b_key)] for i in range(len(c)))
        my = my_function.__code__.replace(co_code=buf)

        succ = b'\x9f\xe3\x9b\x91\xf5\xee\x9f\xea\xa6\x91\xe9\xed\x96\xde\xb7'
        buf = bytes(succ[i] ^ b_key[i % len(b_key)] for i in range(len(succ)))
        my = my.replace(co_consts=(None, buf.decode('utf-8')))

        my_function.__code__ = my
        my_function()
        return
    except Exception:
        continue

核心就是两个异或:

  1. c ^ key 还原 my_functionco_code
  2. succ ^ key 还原成功字符串

求 key

原始 my_function 是:

def my_function():
    print(666)

题目后续只替换 co_consts(None, 成功字符串),所以目标 co_code 和当前 print(666)co_code 一致。

当前 co_code

95005b0100000000000000005301350100000000000020006700

密文 c

ec626d7563727962367463722a630375637962367443721e62

异或得到重复 key stream:

yb6tcryb6tcryb6tcryb6tcryb

周期为 6,所以 key 为:

yb6tcr

传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!

收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回