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) / 40x0000048A

我们正向算一次,(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