找入口
ctrl+f8
找到第一个入口点002f2283
分析一下,下面马上要到,exit
函数退出,所以在这个点和下面一个call
打下断点,然后重跟
f9跑到开始找到的入口点断点002f2283
然后f8继续跟,进入输入界面,输入123123
回车继续看,到下一列了,继续跟看下算法在哪,过了下一个call228d
之后有个test 判定出来a1=00
然后就进入jnz
判断,非0则跳,然后a1=00
,所以不跳直接走到退出,所以002f228D
是关键call
关键算法应该在里面,现在重新跟
跟到这个关键call
里面来
,发现跟下来并没有看见处理我们输入的地方,那就看下最初的入口call
,重放一下
f7跟进2283
,f8继续跟,跟到了一个输入,这个地方就是刚刚2283
的输入,输入123123
回车继续,跟到下一个call
的时候已经看到在处理我们的输入了,
继续f8,走到11c0
,一个cmp
操作,比较0x10
和eax
寄存器的值,eax
的值下面已经写出来了是00000006
,而我们输入的是123123
,所以这里记录的应该是我们的长度,然后比较长度,所以长度应该为0x10
也就是16位的值,下面就是je
判断,应该不会跳直接往下走进入下一个call
就退出。这里我们直接改标志位让他je
通过,继续跟可以跟到这里movsx
看下面框,他是取出第一个我们的输入值也就是1==0x31
,然后进入一个call
我们双击看下这个call
,可以看到一个算法,ecx*2-0x6
寄存到eax,这一步在左边可以看到ecx==0x31==1
也就是我们的第一个输入,然后下一步亦或eax,ecx
亦或之后存在ecx
,继续走,回到跟进之前的页面,继续跟,中间没有处理数据,直到跟到下一个call
,
跟进去,继续算,eax=edx+edx,edx=0,所以eax=0
,然后,ecx=ecx-eax,ecx=0x6D,eax=0,所以ecx=0x6D
,然后,eax=ecx=0x6d
,继续跟,返回,然后到movzx-->eax=0x6D,ecx=0xB9
,用0x6D
减去位数,也就是下标的2倍,第一轮还是0x6d
,用0x6D
拿来比较,猜测是每一个值去一个数来比较,先记下,我们继续跟,
比较然后不同sete-->d1=00
,下面应该会je
判断进入一个退出函数,因为第一个都错了,我们直接跳,jmp
跳回去,循环到2
,
现在是取第二个值2==0x32
然后eax=eax^ecx=0x5E
,继续,
现在eax=0x02
所以可以猜测是已经改了下标知道第3个值了,edx还是1,继续,ds=edx+0x2f5018
这递增的这个起始地址的位置,我们找到这个地址,
开始第一个B9
然后3A
,证明猜想,然后我们看到原来的地方有个11c0
,一个cmp
操作,比较0x10
,所以取16位,也就是B9 3A A9 D8 15 8A E7 42 69 90 CA A3 4D D8 D9 C9
这16个,只要输入的东西经过运算之后等于这一串就可以绕过直接退出。
算法:
第一个call
:ecx*2-0x6,eax^ecx,即时自身乘2-0x6,然后与自身亦或
第二个call
:处理对比地址加的位数,这里可以理解为下标
然后写个脚本:
但是有点问题,跑出来有些项没有匹配