XYCTF 2025
本文最后更新于 2025年4月8日 晚上
实力不行
Crypto
勒索病毒
(感觉这题有点该放逆向里面的)
有一个 task.exe,EP 查一下发现是 Pyinstaller 打包的 python 文件
用 pyinstxtractor
解包
用 https://pylingual.io 进行反编译,反编译结果如下
1 |
|
在解包后的 task.exe_extracted/res
目录下有两个文件 enc.txt
和 pib_key.txt
enc.txt
1 |
|
pub_key.txt
1 |
|
flag.txt.enc
1 |
|
从 enc.txt
的第二个多项式(私钥)提取正项指数(带 + 的指数)
1 |
|
正项指数列表
1 |
|
脚本如下:
1 |
|
拿到 flag
1 |
|
Reverse
Dragon
第一次做关于 LLVM 的题,从 0 到 0.1 的配环境www
新装的 Ubuntu24.04.02,用这个传一下文件
1 |
|
拿到 Dragon.bc
文件之后查看文件类型,还能用 Exeinfo PE 看,但是只能得到是关于 LLVM 的,没有具体信息
1 |
|
Dragon.bc
文件为 LLVM IR bitcode 文件,LLVM 完整编译流程如下:
1 |
|
将 bc
文件转换为 object file
1 |
|
拿出来丢进 ida 分析,找到 main 函数
大概是将 &unk_370
的数据复制到 v7
数组中,然后初始化 Str 数组为0,接着提示用户输入flag,并读取输入到 Str
中
main 函数中还有一个 calculate_crc64_direct()
函数
根据代码中的 0x42F0E1EBA9EA3693
知道实现的是 CRC64
算法,初始值为 0xFFFFFFFFFFFFFFFF
,输入数据每个字节被左移 56 位后与当前 CRC 值异或,然后处理每个位,最高位决定是否异或多项式,处理完所有位后,最终结果取反。CRC 算法有两种处理方式:左移(big-endian)或右移(little-endian),根据函数中 a1[i] << 56
知道这里是左移
找到 &unk_370
的数据
把数据提取出来
1 |
|
正向左移那么逆向就需要右移
1 |
|
拿到 flag
1 |
|
Moon
这题虽然是 pyd
逆向,但应该是最简单的那一类
shift+f12 搜索字符串,前面有一些文件
往下看能发现一串可疑字符串
1 |
|
跟进定位到 sub_180002550()
函数
把里面关键字符串提取出来:
加密相关:
1 |
|
模块加载:
1 |
|
可以看到有 xor
加密,继续看能在 sub_180001370()
函数找到了关于 Xor
的信息,有一个 PyNumber_Xor()
,将 v4
和 v8
异或返回 v5
,然后将 v5
添加到 list 中
仔细分析 sub_180001370()
函数中的 v8
来源:
这里通过 PyDict_GetItem_KnownHash
从 off_18000B618
指向的字典中获取项
1 |
|
通过代码可以发现 v8
的核心来源是 off_18000B618
指向的模块全局字典
然后交叉引用 off_18000B618
发现被 sub_180003010()
函数多次引用
跟进来到 sub_180003010()
函数,在 PyLong_FromLong()
函数中找到了随机数种子 1131796
,这个 PyLong_FromLong()
函数是一个构造函数,主要是对数值进行处理
因此可以得到如下信息:
1 |
|
所以程序主要逆向逻辑:使用固定的随机数种子 1131796
,生成和密文长度一样的密钥然后再和密文异或得到明文
逆向脚本如下
1 |
|
拿到 flag
1 |
|