首页
社区
课程
招聘
[比赛]看雪.WiFi万能钥匙 CTF 2017第六题 点评及解题思路
发表于: 2017-6-28 18:42 2626

[比赛]看雪.WiFi万能钥匙 CTF 2017第六题 点评及解题思路

2017-6-28 18:42
2626

看雪CTF 2017 比赛进行至第六题


截止至今天中午12点,第六题破解人数为16人!


爱琴海依然位居防守方第一名~


攻击方排名前十名变动较大,比赛排名有人升、有人降。

值得注意的是,前十名又出现一些新面孔,

目前ccfer冲到第六位,EricAzhe突进第9位


随着比赛的进行,选手的表现给了我们越来越多的惊喜!

比赛悄悄的走过半程了,

还会有怎样的惊喜等着我们呢?静候各位佳音啦~

接下来我们来回顾一下第六题

看看 看雪评委和出题者是怎么说的ヾ(๑╹◡╹)ノ"。






看雪评委 netwind 点评


本题是一道安卓平台下的破解题,java层用了字符串加密和类名混淆,在so层采用了花指令混淆来干扰破解者,核心算法是把注册码RC4加密后再Base64编码,然后与内存中密文比较。清理掉花指令,找到关键比较的地方后就可以破解此题。


作者简介:


Ericky,90后,毕业于中南大学机电工程学院。目前就职于百度网络技术有限公司。因为“网瘾少年”的缘故,我踏上了逆向破解这条“不归路”,因此也与看雪结缘。虽然不是科班出身,但是从大学开始对软件的加密解密就极为感兴趣,目前研究的方向主要是系统漏洞利用、app算法分析,app逆向脱壳等。擅长于android平台的逆向破解。


看雪 CTF2017 第六题设计思路


1. java 层稍作字符串加密和类名方法名混淆处理。



解题:通过阅读代码,可以知道check函数为关键函数,当返回为真的时候,注册成功。

2. so 层用花指令对程序指令进行混淆,在一定程度上防止分析。

解题:编写去花指令脚本,F5 就会变得很简单。去花后 check 函数如下:


这样就能很清楚看到注册过程了。sub_19DA8 为加密函数,采用了 RC4 加密 +base64 编码。

3. 值得一提的是,so中藏关键字符串数据的方式我自己觉得挺有意思的。不知道聪明的你有没有发现呢?

4. 答案:madebyericky94528

下面选取攻击者 loudy 的破解分析


使用工具:ApkIDE3.3(分析dex) IDA6.8(分析、调试so文件) python(base64解码) notepad(记录、爆破) Android Emulator(内核4.4 调试用) DDMS(调试用)Adb

步    骤

此 android 题对 dex 文件名进行了简单混淆,用ApkIDE打开如下,在真正的名称前加了一堆符号,但不影响分析。


从此处可以看到主要逻辑在库文件librf-chen.so中的check函数。




IDA载入librf-chen.so,可以发现能识别check函数入口如下。




此时用F5反编译,完全不明白。




再看汇编代码,sub_286C是一个死循环,混淆分析,真正的跳转地址为loc_2874处。



来到loc_2874处,发现仅有一条语句有用,从2878直到28DE全是花指令代码,可以直接填充为0(movs r0,r0;相当于x86体系的NOP)。




并且so文件中基本只有这种花指令模式重复出现,可以写脚本自动去除花指令,也可以手动进行(时间在允许范围内)。去除之后再看check函数如下,已经很正常,且99行的比较即为关键比较。




次处比较对应汇编代码位置如下,调试可以知道此处是输入注册码经过计算后与固定字符串“JPyjup3eCyJjlkV6DmSmGHQ=”对比,看到该串中的“=”有没有想到base64,没错,就是base64,但不是直接对输入进行编码,而是输入先转化后编码。

此处编码表也很清楚。

Check函数中97行取得输入字符串,98行的sub_19DA8函数对输入进行处理,进入该函数F5,如下所示,其中第28行函数sub_5AFC即base64编码,但编码前先对输入字符串中的每一个字符进行了独立处理,由于可选参数集仅为字符和数字,范围不大,考虑不再分析算法,用爆破。

即每次输入17(注册码长度)个相同的字符或数字,在sub_5AFC函数调用前记录输出结果。

最后全部结果与“24 FC A3 BA 9D DE 0B 22 63 96 45 7A 0E 64 A6 1874 00”(“JPyjup3eCyJjlkV6DmSmGHQ=”base64解码结果)按位对比,得到注册码“madebyericky94528”(作者打广告)。

运行成功

题外话,此题主要在去除花指令要花时间,看so文件代码发现了很多反调试,有getpid、kill、exit等,但实际却没影响,可以附加调试,JNI_OnLoad中有ptrace,但调试时nop掉与否没影响,每回都是调试几次之后就不行,必须重启。



最后感谢 WiFi 万能钥匙安全应急响应中心的赞助支持,

接下来的比赛大家一定要使出洪荒之力哦!↖(^ω^)↗

比心 ❤


赞助商

上海连尚网络科技有限公司成立于 2013 年,是一家专注于提供免费上网和内容服务的移动互联网企业。连尚网络自主研发的核心产品 WiFi 万能钥匙,以分享经济的模式,通过云计算和大数据技术,利用热点主人分享的闲置WiFi资源,为用户提供免费、稳定、安全的上网服务,以帮助更多的人上网,找到属于他们的机会,改变自己的命运。



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//