-
-
[原创]CTF2017第三题分析
-
发表于:
2017-6-11 21:44
4352
-
这个题目设计的不错,感谢题主
坑是smc,一开始不知道!不知道!不知道!坑是三个加号改减号,变量v94 v8c存放位置颠倒。因为存在约束,题目给出的原算法不可行,没有实数解,明知道有坑,不知坑在哪。
题目是VB Pcode,好多年没接触了,因为做题又拣回来,pcode主要是读指令,在虚拟机中打转,变量围绕stack操作,浮点数的存取计算则用到st寄存器。
工具用到看雪主页提供的VB Decompiler Pro用于看算法,ljtt VBParser用于看指令的具体地址,OD用于跟踪。
smc是后来关注到的,一开始改了EIP为1090,后来因为算不出来怀疑自己是不是中招了,恢复原状,结果跟踪时发现代码中有的加法怎么变减法,于是对内存下写断点,才发现有SMC,其中有rdtsc运行时间检查,细节没太关注,通过内存写断点可知,就是异或了上面提到了五处,如果你去跟,会一直在里面打转。OD加载后直接运行就行,在点验证之前设内存断点就可以跟踪了。
Regcode应为16个字母,16进制形式,分为两个dword,设前半部分为L,后半部分为R:
初始化代码为:
约束条件是:
L, R<0x80000000; L>R; X+R>L; L+R>X
用到的公式是
其中((2 * X^2 * L^2 - R^4 - X^4 + 2 * X^2 * R^2 + 2 * L^2 * R^2 - L ^ 4 ) ^ 0.5)=((X + L + R) * (X + L - R ) * (X + R - L ) * ( L + R - X)) ^ 0.5 ) 我是查百度来的,公式知识已经忘光了
设上式为DLT,则:
0.5*DLT/(X+L+R)=A ...(1)
X*L*R/DLT=B ...(2)
约去DLT,将R用L表示
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课