首页
论坛
专栏
课程

[分享]Q1晋级赛第一题writeup,新手入坑

2019-3-11 21:35 451

[分享]Q1晋级赛第一题writeup,新手入坑

2019-3-11 21:35
451
第一次参加比赛,还有点小激动,菜鸡做题,大佬轻喷。
我想把这篇writeup写的详细一点,希望能帮到那些刚刚入门的人,不废话了进入主题。
一般看雪ctf的crack me 是没有加壳的,拿到题目运行一下,,看看有那些字符串,是不是窗口化程序,还是控制台程序(找线索)
好了知道了,猜测这个窗口化程序可能是用API函数GetWindowText这个函数获取文本框的数据的(因为之前没考虑到这点卡了好一会儿,稍后说明)
接下来放进ida pro开始分析,先string了一下,根据字符串直接交叉引用xref来到了这个函数,
再f5反编译出伪码,如下图:
看到这里我就理所当然的以为a1是文本框的输入值,以为是在这个字符串中根据输入字符的10进制ascii码对应下面这个字符串每个字符的位置,把KanXueCTF2019JustForhappy拼凑出来。
但是我嫌这25个字符太长了,我就用winhex把这个字符串改来只有字符Kan,这样方便看我的猜想是不是对的。
我打开16位编辑器,定位到这个字符,然后把K后面的全部填充为0,不能剪切,这样会影响程序格式,使程序无法运行。
修改过后:

但是并没有我想象的那么简单K在第二十位,没有ascii码为20的字符,有的话也是键盘不能输入的,所以我的猜想错了,
这里就要说到前面的GetWindowText了,当我没有思绪的时候,想到a1不一定是用户输入啊,突然恍然大悟,去ida的Imports表中搜索这个API,再交叉引用xref,找到这里

好了,继续反编译,菜鸡只会反编译,我知道大佬都是看汇编的
好了发现问题所在了,原来我输入的字符串是Str[i]经过了一个循环判读,把我的字符串处理过了,好了我来分析一下这个处理过程:
一个大的for循环限制每一个字符都要被处理,三个if else对这些字符进行转换,查看ASCII表发现这三个if里面的判断条件刚好是0-9,a-z,A-Z。首先要求是这些字符的合法输入,不然又跳到失败去了。如果合法之后,进入else条件第一个if,else刚好将ascii码为48-57的字符处理成0-9。第二个if,else则是处理到10-35,第三个则是36-61。看到这里,哈哈刚好和后面的62个字符长度的字符串对应起来,因为数组地址是从0开始的嘛0-61.这下我来分析一下密码对比字符串被我删除来只剩下一个Kan了,
位置:19(数组从0开始)
对应:10-35     然后加87
得到107,找到106ascii对应的是    j
继续算出:j0r
输入密码好了我的猜想正确:
接下来算出所有25位长的密码: j0rXI4bTeustBiIGHeCF70DDM
最后总结一下:这个类型的题目,要从用户输入到密码对比,整个过程都要清晰的分析出来,程序到底执行了些什么操作,感觉出题者还算友好,出题者还没设计一些反动态调试和抗反汇编的技术来干扰调试器或者反汇编器,(即使是ida这样面向代码流算法生成汇编语言的工具也经常会被聪明的程序设计者戏弄)或者使用更为复杂的密码算法。。。。。
作ctf题是对逆向工程打下坚实基础的好方法,似乎才刚刚开始,这个旅程。。
希望看见这篇帖子的新手都能坚持下去。



[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (1)
netwind 13 2019-3-12 09:26
2
0
不错
游客
登录 | 注册 方可回帖
返回