首页
社区
课程
招聘
[原创]CTF2017 第一题 WannaLOL IDA单步调试(纯新手偷鸡做法)
发表于: 2017-6-1 19:05 4464

[原创]CTF2017 第一题 WannaLOL IDA单步调试(纯新手偷鸡做法)

2017-6-1 19:05
4464

好多浮点汇编指令不认识。。我只能大概找出关键的地方,以下是我的分析流程:

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期)

收藏
免费 0
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  CCkicker   +1.00 2017/06/06
最新回复 (7)
雪    币: 234
活跃值: (867)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
支持一下,分析的不错
2017-6-5 19:11
0
雪    币: 6112
活跃值: (1212)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
3
支持!
2017-6-6 10:27
0
雪    币: 204
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持!
2017-6-6 14:38
0
雪    币: 29
活跃值: (61)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
第一次发帖。。谢谢
2017-6-7 10:00
0
雪    币: 1760
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我还是没看懂,看来还要继续学习才行
2017-6-7 22:40
0
雪    币: 29
活跃值: (61)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
startstorm 我还是没看懂,看来还要继续学习才行
加油
2017-6-8 09:05
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
8
jz和jnz放在一起是作者的手動混淆,反反汇編,加油
2017-6-9 23:26
0
游客
登录 | 注册 方可回帖
返回
//