2025]FishingKit
[GHCTF 2025]FishingKit
题目描述:一个钓鱼佬坐在河边准备钓鱼,从工具箱中掏出了钓鱼竿、钓鱼线,但是钓了半天一条鱼都没有。诶?似乎少了什么… …
拿到文件先查壳,发现这个无壳,64位。将它拖到IDA中分析。
bait是鱼饵的意思,一个勤恳的钓鱼佬怎么能没有鱼饵呢,所以我们要知道bait是什么。
如下所示,v4就是bait,这有个if语句,应该是给v4赋值的,然后就得到第二个东西(ps:我盲猜是个鱼钩)是v5,sub_7FF69CE42460函数就是v4作为密钥,将v5进行加密,得到Str1。strcmp函数将Str1与Str2进行比对,如果相同的话,就成功了,逆过来就可以得到flag。按照常规操作来讲的话,很对。。。


| 1 | from z3 import * | 
使用z3求解器可以来求出bait(v4):DeluxeBait
接下来分析sub_7FF69CE42460函数里面进行的操作,可以发现,这是一个变种的RC4加密算法
byte_1400060C0 是RC4的S盒(256字节数组),sub_1400028B0 负责用密钥a3打乱S盒。


将密钥 a1 按字节循环填充到 v7 数组中,使其长度为256字节。
索引计算:v5 = (key[k] + S[k] + v5) % 256
交换操作:交换 S[k] 和 S[v5]
思路:
- 还原S盒状态:- 若密钥 a3(即v13)已知,可重新运行此函数生成相同的S盒。
- 动态提取 byte_1400060C0初始化后的值(调试器查看内存)。
 
- 若密钥 
- 加密流程适配:- 后续的 sub_140002460函数(PRGA)使用此S盒生成密钥流。
- 加密时额外异或 0x14,解密需先异或0x14再按相同S盒解密。
 
- 后续的 
3.目标明文:[0xE9, 0x37, 0xF8, 0xE2, 0x0C, 0x0F, 0x3D, 0xB9, 0x5C, 0xA3, 0xDE, 0x2D, 0x55, 0x96, 0xDF, 0xA2, 0x35, 0xFE, 0xB3, 0xDD, 0x7F, 0x91, 0x3C]
原以为可以美美求解了,没想到flag给我虚晃一枪,哈哈哈哈这个是掩人耳目,是个错误的flag
这个时候,要进行动态调试,看看函数到底是如何调用的。在strcmp函数处下断点进行调试,单步步入F7,发现了它跳转到另一个函数里面去执行了。函数如下所示:进行分析发现是XTEA加密算法
| 1 | __int64 __fastcall sub_7FF69CE41CE0(_BYTE *a1, unsigned __int8 *a2) | 
v32就是密钥,就是DeluxeBait。密文是byte_7FF69CE463C8,进行交叉引用查看


找到了密文,进行XTEA解密,这个加密轮数是24轮
| 1 | 
 | 

解出来flag:NSSCTF{Wh@t_@_b1g_F1sh}



