首页
社区
课程
招聘
[原创]看雪CTF2019 Q3参赛题目 第九题:一统天下 -Android-吃鸡辅助
2019-8-12 17:54 5321

[原创]看雪CTF2019 Q3参赛题目 第九题:一统天下 -Android-吃鸡辅助

2019-8-12 17:54
5321
出题思路:
仿照一个Android勒索软件,屏蔽了加密文件的逻辑,保留了加密算法。一般恶意软件都会做一些反逆向的工作,所以加入了反jadx、jeb等反编译工具(原本是Q2 6月准备的题目,可能工具更新后,现在效果不行了),加入了混淆、简单的花指令、反调试等,更进一步把加密算法抽取出来使用自定义的解释器执行。

解题思路:
虽然有混淆和字符串加密,但是字符串加密很简单。根据界面上的Decrypt按钮定位到Button控件


Button绑定的事件,解密字符串得到"The key is correct and the decryption begins!"和"Key error!",所以第二个if分支成立的话就是输入正确。


继续往下追,根据解密后的字符串知道输入值就是flag,而且如果输入格式是falg{...}格式,只取中间的字符串。



之后调用的函数就是反jeb的函数,可以发现jeb无法解析,但是可以看smali代码,

分析发现把输入的字符串经过一个native函数返回一个字节数组,对字节数组转为hex,和"820e52333de3bcb42467f0a20564c145af5edbf2e923df33be21f0af159710c92cbc43f79f94ec930a7ae86021af5b3ae263369299de5436b85f297be08a032a28dc357391961ecc26931bfc97d67a5e74d8781fb4105b9afbe613a2041dd8c3"比较。所以关键是这个native函数

分析该函数应该在libmydvp.so中,这个so有混淆、花指令、反调试,patch花指令、反调试后或者动态调试,追到这个函数的实现。

追到注册函数的地方,或者hook系统函数得到地址,


分析流程发现:
注册jni函数,解压assets/ssspbahh.so文件解析。

分析native函数,发现:
有200多个分支,从解析的ssspbahh.so数据结构中取2个字节的数据,根据数据不同,进入不同的分支。

进而得到指令的对应关系,可以把得到的dalvik指令填会dex,或者调试完整个函数的指令,分析出是个变形的sm4算法,





实现sm4的解密函数,解密
//解密后
byte[] srcDtat = {-82,41,99,-40,43,-53,114,101,43,-53,114,101,-82,-23,125,68,43,-23,28,126,43,-23,28,126,-82,-23,125,68,-82,41,99,-40,41,47,54,114,43,78,3,43,38,77,3,42,126,99,28,68,99,99,-94,94,78,-41,-94,94,78,-41,28,68,99,99,-104,126,-24,38,-104,99,99,-24,28,70,-52,99,28,29,-37,54,116,116,};

//加密后数据
byte[] enDtat = {-126,14,82,51,61,-29,-68,-76,36,103,-16,-94,5,100,-63,69,-81,94,-37,-14,-23,35,-33,51,-66,33,-16,-81,21,-105,16,-55,44,-68,67,-9,-97,-108,-20,-109,10,122,-24,96,33,-81,91,58,-30,99,54,-110,-103,-34,84,54,-72,95,41,123,-32,-118,3,42,40,-36,53,115,-111,-106,30,-52,38,-109,27,-4,-105,-42,122,94,116,-40,120,31,-76,16,91,-102,-5,-26,19,-94,4,29,-40,-61,};<br>

之后参照java层的转换,得到flag{gyyfadclfcdg8822g}或gyyfadclfcdg8822g,根据题目描述的格式提交,(看雪的格式应该是去掉flag{}的格式),所以为gyyfadclfcdg8822g

解密后的数据使用base64解码后得到:请本本载不不载请+422199147软不不软卸微请要
根据代码分析  “请本本载不不载请+”= 422199147,“ 软不不软卸微请要 ”=89985746
long为42219914789985746或者-42219914789985746



挨个取16进制做为索引,得到字符。

(自动生成的flag,限制的是15个字符,但是开始后发现多了2个字符,17个。最简单、最容易得到的flag为:
yyfadclfcdg88228

注:名为mysigned.apk会修改手机的桌面,如果不合要求,可采用mysigned_no_desktop.apk,不会修改手机设置。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-9-25 10:33 被kanxue编辑 ,原因:
上传的附件:
收藏
点赞2
打赏
分享
打赏 + 20.00雪花
打赏次数 1 雪花 + 20.00
 
赞赏  Imyang   +20.00 2019/09/25 精品文章~
最新回复 (1)
雪    币: 32410
活跃值: (18720)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2019-9-25 10:34
2
0
此题多解

m}y8hm8yecc002,dyyfadclfcdg88228,dgyyfadclfcdg8822g,ddgyyfadclfcdg8822g。。。



游客
登录 | 注册 方可回帖
返回