2015 XCTF&RCTF Where 300
2015XCTF福州站的第二道Mobile题,分值200
想到第一题才100分就那么折腾,这题估计好不到哪里去
使用JEB反编译,发现逻辑很是简单

输入用户名和密码,长度要想等,用户名和密码的逆序串相等则输出字符串
返回flag

Oops,出题的大佬良心发现故意来个简单的
Too simple sometimes naive

看文件夹结构
删了一些布局文件,不然长的没天理了
发现有两处看起来值得注意的,一个是assets文件夹,一个是签名文件夹下的y
熟悉Dex文件结构的同学应该很清楚这是abc文件其实就是Dex的Dex Header,从长度来看很清楚的0x70

再看y,看不出是什么,我就想:"y会不会是Dex后面的数据,出题人把它拆分了",但是怎么都合不上

y会不会是加密了
就这几个字节还加密
当我看着y发呆的时候,突然

按照常理,这个应该只有1kb左右
这个为什么这么大
由于一直对前面的Dex Header念念不忘,抱着打死出题人也要找出Dex后面数据的决心,做了一个大胆的猜测,Dex后面的数据肯定在这里
找到1kb左右偏移的地方,左边偏移是十进制形式

看到了关键的字眼KEY=Misc@inf0#fjhx11,这可能是在告诉我们秘钥
接下来进入高潮DEX=,这个意味着后面的数据就是Dex Header以后的数据,再结合前面的KEY,说明这一片数据应该是被加密了,熟悉Dex格式的同学应该清楚Dex Header后面是String Ids,是一片很整齐的数据,而这里乱七八糟的,明显是加密了
我们把它拷贝出来,就在看最后的数据长度的时候,发现另一个关键信息aes-128-cbc

这是在告诉我们加密方式
接下去这一步就看个人了,搞过openssl的同学肯定记得这个,虽然到现在我也不知道到底help是哪个命令
所以看到aes-128-cbc我的第一想法就是openssl
我们把最后面的aes-128-cbc删掉,使用openssl解密
解密后的数据就很漂亮了

将解密后的的数据拼接到abc文件后面,使用JEB打开,提示不是有效Dex文件
其它工具解析也是类似错误
使用010Editor的模板功能分析
红框内全是0,需要我们手动修复一下

首先我们找一个正常的dex.classes文件,用010Editor解析一下

列一下Dex Header的数据,因为是小端序,所以真实的数据应该是后面这种形式
前面那些可以不在意,我们关注_ids size和_ids off这种数据
首先是string_ids,起始偏移为0x00000070,紧跟着Dex Header,长度是0x00002469 * 4字节
再看type_ids,起始偏移为0x00009214,(0x00009214 - 0x00000070) / 4刚好是0x00002469
再来看一组proto_ids,(0x0000A43C - 0x00009214) / 4是0x0000048A
我们正向算一次,(0x0000A43C + 0x0000064C * 12)是0x0000EFCC,这里长度是12是因为它的结构数据长度是12个字节
对照着这种方法来修复一下刚才合成Dex文件
然后我们噼里啪啦一通算
现在就已经计算完所有需要计算的数据了
如果不想算,还有一个办法,就是maps数据
正常的Dex文件maps数据,12个字节为一个item

把合成的Dex文件maps段数据拷贝出来,整理一下
对比就可以发现其实这里就有我们需要的数据,而且已经计算好了
将计算出来的偏移填充进去,注意是小端序
修复完如下,可以直接修改010Editor右边窗口的数据,左边会自动修改为小端序

使用JEB打开修复后的Dex文件

发现onCreate()方法反编译失败
查看对应的smali代码

发现onCreate()方法的代码是nop,鉴于其它方法都是正常的,那么这里明显是被抽走了,搞过加固的同学肯定眼熟这种形式,运行时动态恢复指令,但是这里没有so,明显不是
踌躇之际,我突然想到还有一个y,长度是0x94

再看这里nop指令长度
长度也是0x94,一条指令2字节长度,最后0x92 + 2
那么y就应该是被抽走的onCreate()方法的指令
使用IDA打开Dex,找到对应的偏移0x00097390

找到偏移后,使用Winhex找到Dex文件对应的偏移

一大片空白,将y的数据拷贝进去

保存之后使用JEB打开最终的Dex文件

写下代码跑出flag
输出
Last updated