-
-
[原创]CTF2017 第一题 WannaLOL IDA单步调试(纯新手偷鸡做法)
-
-
[原创]CTF2017 第一题 WannaLOL IDA单步调试(纯新手偷鸡做法)
好多浮点汇编指令不认识。。我只能大概找出关键的地方,以下是我的分析流程:
1.利用IDA打开,找到GetDlgItemTextA,肯定是从这开始把;
2.函数第四行
可以看出eax中存放的是当前栈顶地址,然后调用GetDlgItemTextA(),这个函数的第三个参数传入的是eax,可以得出输入的字符串保存在eax的值所表示的地址中。
紧接着有个延时函数,即sleep(500);
3.
将我们输入的字符串首地址赋予eax,调用strlen()获取字符串长度
strlen()返回值保存在eax中,在这里做了第一次判断,根据跳转逻辑可以得知,这个key的长度为4(还好比较短。。)
4.
继续下来开始判断输入的4个字符中有没有‘0’ (0字符的16禁止asc码=30h),没有发现则继续;
5.
接着判断输入的第一个和第二个字符是否为1和5。。符合要求则继续,至于这里为啥有jz和jnz在一起我就不知道为啥了。。
6.
接下来这里就真的难了,这段真的把我绕晕了,浮点指令基本都不认识,一个一个查的,但是好在这里没有什么加壳之类的,有偷鸡的方法。。
可以看到这里的关键就在fcomp这个指令,因为他直接决定下面这个跳转!百度一下fld和fcomp我大致猜了一下这个跳转条件应该是
if([ebp-4] == flt_407118) success;
else error;
这个flt_407118是只读的,值为384.0,;
以上的分析至少可以得出可以的形式为15XX,现在只要确定xx的范围就好,总之这两个字符都在1-9的范围内;这里说来也真是太巧了,我推到这里的时候直接用55来测试(1555),。。。结果正好蒙对了。。我们可以先用99开始发现这个得到的值在比较384的时候会比他大很多,11-99这个范围也还是比较轻松的。。。
ps:感谢生利同学的帮助,浮点算法部分的算是总算是弄明白了,在这里补充一下把,结合以上的分析,四个数字字符分别记为p1 p2 p3 p4;
算法公式为:(p3-p1/p2)*p4*16.0=384 和上面的分析是不冲突的,期中p1=1 p2=5
=>(p3-0.2)*p4*16.0=384 => (p3-0.2)*p4 = 24 => p3 = p4 = 5
感觉有点对不住作者,常规的计算思路我还没看明白,真的要好好学一下汇编了
非常感谢作者出的这道题,帮我很好的复习了一下汇编的基础指令(都快忘光了- -)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)