CISCN2025 初赛简单题 vvvmmm

DIE 查壳,有 UPX 壳,没有魔改对抗,直接 upx -d

静态链接,需要还原一下 libc 符号,可以看到还有一大堆没有识别的,推测还静态链接了别的库

主函数有一点平坦化和 data 解密的内容,可以使用调试来 dump 这些数据,在 puts 下断点

可以看到比较关键的数据是 0x64c3f0 的 662 字节数据和 0x64C6C0 的 32 字节字符串,点进下面的疑似进入 vm 的函数 sub_4099D0 可以看到字符串 timeout,再点进去,可以看到 qemu_thread_create 字串引用

搜索字符串 qemu 有 riscv 相关字串

大胆猜测 662 字节的数据是 riscv 字节码,调试 dump 出来

算法比较容易,但是这里有个坑,最后一个基本块因为没有 ret 函数,没有反编译出来

它实际上就是把上面 32 字节的字符串(key)用哈希压缩,然后通过不断的 13 次方生成 12 个 4 字节数,和 48 字节的输出逐个异或,最后比较

比较的方法是 xor,试图检测 xor 完是否为 0

最后一个没反编译出来的基本块正好有 12 个 xor,但这里因为 RISCV 的编码位宽不够,加载立即数时有一些间接的计算,直接把汇编拖到 AI 中让它算出 12 个常数即可

flag{fANUES0XtUXBDEbOXs4xFcXDb3Q5kMU87bZLMZJfuRnCvfwX}