-
-
[原创] KCTF2504 第四题 血色试炼 WriteUp
-
发表于: 2025-8-22 11:37 3745
-
该题复合自定义的xBase64和xAES算法通过Serial=UserName;迭代四次Serial=xBase64.encode(xAES.encrypt(Serial))得到最终Serial;使用了syscall方式直接调用内核api及异常分发机制。修改的xAES算法由于业务逻辑错误或故意为之,使得128位key实际有效96位,其余32位固定位0.
获取UserName的Serial,这里定义
(1)定制的base64相关的encode和decode业务逻辑声明为:xb64_encode,xb64_decode;
(2)定制的aes相关的encrypt和decrypt业务逻辑声明为:xAES_encrypt,xAES_decrypt;
(3) xAES_decrypt(xb64_decode(...))和xb64_encode(xAES_encrypt(...))分别声明为: dd_code,ee_code;
题目中的验证逻辑为:ee_code(ee_code(ee_code(UserName)))==dd_code(Serial)
此文中IDA相关的主exe分析基址为:0x7ff7a7bb0000
在main函数下述位置定位到异常分发函数Hi_handler

在异常分发函数中我们定位到ee_code函数,其返回一个ostringstream对象,我们对后面的ostringstream_str函数通过frida插桩可以得到每次ee_code的结果,
由于每次样例执行,只触发ee_code三次,我们两次执行样例插桩,用前依次结果作为UserName输入,就可以得到4次以上ee_code结果,从中获取Serial

如图,我们提示输入用户名时,通过frida对ostringstream_str函数进行插桩,其偏移为0x2058

插桩代码
原理
输入KCTF和样例Serial(随意,由于原样例对于不规范serial退出不友好,我们使用样例serial),于是得到KCTF三次ee_code的结果
我们再重复一次,这次UserName输入上述的最后结果【l/SxsR0BCjRZTmc7XWscrMv38iYuoiUECvi9Tuvi+ZiJZmdR5EcvVnTZOZvrnOrw】,得到的【tSzQkyqcvZLgkwDltPF9RpInibA5fTpH/bJni2yvLzTKao2uL5eLZ5QIxPj8bsYWe48ZohC5/Jw3cNNAaX8/rA==】就是UserName=KCTF四次ee_code后的Serial

如图,通过python的pefile模块,我们查看exe的字符串资源