-
-
[原创]巳时·绿光幽语
-
发表于: 2天前 67
-
附件 题目.rar 解压后得到 题目.exe。对 EXE 做字符串和结构分析,可以看到 python313.dll、base_library.zip、PYZ.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
核心就是两个异或:
c ^ key还原my_function的co_codesucc ^ 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
赞赏
他的文章
- [原创]巳时·绿光幽语 66
赞赏
雪币:
留言: