首页
社区
课程
招聘
[原创]看雪CTF_2018 团队赛 第五题 write up(吃我十六字阴阳风水秘术)
发表于: 2018-12-9 23:32 3777

[原创]看雪CTF_2018 团队赛 第五题 write up(吃我十六字阴阳风水秘术)

2018-12-9 23:32
3777

系统 : Windows 7、nexus 5
程序 : CrackMe.KwaiChing.apk
要求 : 输入口令
使用工具 : 称骨算命、Android Studio、jadxapktool

在测试机中安装该apk,发现程序需求一个key,如果以123这样的随机数作为输入的话,会输出failed!!!

我们使用apktool反编译这个程序

然后在\res\values\strings.xml位置查看字符串信息:

看来存在有一个提示正确和一个提示错误的字符串,还有就是success34的迷之字符串。我搜索了一下,居然发现了存有相关信息的网页

看来是一个玄学题目(笑

我们运行jadx:

定位到p007cn.kwaiching.crackme包下的CrackMe类,发现这就是算法的主流程:

来看看a的流程:

我们先来查看h函数的部分代码:

这样的代码就是jadx的反编译出了点问题,我们需要设置一下选项,让代码的可读性变高。

这里,在jadx的菜单中点击文件->设置->启用反混淆,接着选择
显示不一致的代码。这时,可以发现代码漂亮了不少。

在jadx中查看,不如导入到android stdio(下文中简称为as)这样专业的ide中查看,这样能修改变量名,快速查看引用位置等等。

这里,在jadx的菜单中点击文件->另存为 gradle项目,选中一个任意一个空的文件夹,然后保存就可以。

在as中,发现主流程是:

m166c函数的流程是:

稍微分析一下,可知程序把输入限定在:

再来看看其他的函数:

这里其实是将可能的输入范围减少了,比如第一个判断,2004和1989年的所有可选日期都是31号。以此类推。

最本质的操作都是从固定数组中取值,然后返回相关值。以下是相关数组:

这个判断函数,emmm...

可知需求i值为34了。

我们知道,作者需求我们输入生辰八字,如果生辰八字按某种特定方式取值相加的结果为34,那么夺旗成功。

计算一下遍历所有可能的计算次数:

十万次的运算对于计算机来说不算什么,如果发现可能的结果太多,再添加m167d函数中的判断缩小取值范围,还有m171h函数中的这一句:

其实表示,月份为2时,时辰索引值不能取6,否则失败。

根据以上逻辑,我们做python代码如下:

最终运算结果如下:

根据月份为2,索引值不能为6的推论,我们得到了唯一的flag1995020305to07,输入flag,程序提示成功,并弹出一段迷之算命结果。


[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

最后于 2018-12-10 20:29 被顾言庭编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//