-
-
[原创]看雪CTF_2018 团队赛 第五题 write up(吃我十六字阴阳风水秘术)
-
发表于: 2018-12-9 23:32 3803
-
系统 : Windows 7、nexus 5
程序 : CrackMe.KwaiChing.apk
要求 : 输入口令
使用工具 : 称骨算命、Android Studio、jadx、apktool
在测试机中安装该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,程序提示成功,并弹出一段迷之算命结果。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [原创][安全运维向]模拟搭建小型企业内网 14349
- 攻防世界-PWN-高手进阶区-难度3到4-全部题解 18861
- [原创]攻击格式化字符串在.bss段的程序(bugku-pwn6) 15274
- [原创]XCTF攻防世界-pwn新手练习区全部十题解析 14392
- [原创]KCTF2021 第二题 write up 5549