不愧是强网杯,题目质量确实很高。不像现在很多某某杯,要么是卷大量大量的网上抄的代码,要么是为了难而偏各种奇奇怪怪的新架构
ezmath
这题就离谱,纯数学题,直接见识了各位师傅带数学家的数学功底
刚开始想的是用爆破,但发现不管是patch原程序用程序本身爆还是动态插桩还是模拟执行都爆不出来。猜测程序本身的check逻辑就是有问题的。直接扣算法算发现因为精度问题到后面全部截断了。
发现程序在main函数前做了一些操作。在init函数里会算出V3,因为精度问题,用它是算不出flag的。将init里整个表达式列出来,带回到main的check里,做二分趋近可得flag。
Sub_1301里是泰勒展开式,Sub_11C9是辛普森积分,以下是我的数学推导过程(三个师傅算了一晚上才算出来 呜呜呜)
|
|
看了别的师傅的解法,我直接膜拜。这个式子可以抽象成数列
然后…一行代码解决(tqltql
StandOnTheGiants
apk逆向,jadx打开看到所有check逻辑都在so里。IDA打开so发现里面逻辑挺复杂。动调附加so,发现断不下来,看Modules列表发现so被隐藏了,base.apk就是so文件(有点像Windows下的反射dll或者说无模块注入)。Rebase过去就可以正常调试了。
在check函数开始处会先对输入做hex,然后初始化RSA的各种向量最后对输入做RSA,后面是一个换表的base64。RSA p和q可以直接用在线工具质数分解出来。但是解的时候发现正向输进去的输入和预期完全相同,但是密文怎么都解不出来。来回调了很久最后发现这tm表有二义性。魔改后的Base64的表具有二义性,带了两个+两个-。我的解决办法是找出密文种所有的‘+’和‘-’,然后脚本遍历密文,遇到这两个符号就分裂出两种状态,分别用4个别的符号填充他们
这样能分裂得到2^14条密文(因为±共有14个),对这些密文解RSA,即可找到flag
|
|
LongTimeAgo
exe程序,IDA打开后可以看到里面代码特别乱,有很多垃圾指令,还用了大量的结构体。前后跟了几次,在main函数里会先对输入每8字节一组做hex,然后将这组密文连同正确的加密密文填入结构体
填充完毕后下面四个一样的函数sub_403460是做初始化key,分别保存在参数结构体的第二个成员里
然后下面就是对前32字节输入做XTEA加密,后32字节输入做TEA加密。(这TEA和XTEA的代码跟奥里给一样,还把好多运算符写成函数,人都看傻去
最后再根据奇偶做了分别的异或
|
|
unicorn_like_a_pro
这题比赛时没整出来,赛后复盘了。题目内部静态编译了 unicorn 框架模拟执行一段 x64代码。因为静态编译进去的,函数实在太多了,需要先用bindiff修复符号表。
因为框架并没有被魔改,可以git下unicorn的源码,然后make出来,编译一个demo然后做bindiff。我是make unicorn后,直接将目录下的 libunicorn.so.1 (unicorn的库文件)给拖出来与二进制文件做了bindiff,因为该库文件中包含了几乎全部的unicorn框架代码,故可以修复得到比较全的符号表(但并不是全部),有些函数例如 uc_open, uc_reg_write这些不知道是不是因为unicorn版本原因还是什么的,题目文件中的代码与库中代码相差较大,只能人工识别辨认。