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 | |