首页
社区
课程
招聘
[原创]第一二三题解题思路
2015-1-26 19:03 4428

[原创]第一二三题解题思路

2015-1-26 19:03
4428
第一题思路:

使用AndroidKiller 载入AliCrackme_1.apk进行分析. 发现最核心的就是两个函数getTableFromPic()和getPwdFromPic()函数.

getTableFromPic()从资源中读取出这么一个表.

"一乙二十丁厂七卜人入八九几儿了力乃刀又三于干亏士工土才寸下大丈与万上小口巾山千乞川亿个勺久凡及夕丸么广亡门义之尸弓己已子卫也女飞刃习叉马乡丰王井开夫天无元专云扎艺木五支厅不太犬区历尤友匹车巨牙屯比互切瓦止少日中冈贝内水见午牛手毛气升长仁什片仆化仇币仍仅斤爪反介父从今凶分乏公仓月氏勿欠风丹匀乌凤勾文六方火为斗忆订计户认心尺引丑巴孔队办以允予劝双书幻玉刊示末未击打巧正扑扒功扔去甘世古节本术可丙左厉右石布龙平灭轧东卡北占业旧帅归且旦目叶甲申叮电号田由史只央兄叼叫另叨叹四生失禾丘付仗代仙们仪白仔他斥瓜乎丛令用甩印乐"

getPwdFromPic()从资源里面获取预设密码.

"义弓么丸广之"

之后获取用户输入的密码每一位转成BYTE类型在getTableFromPic()中进行索引, 之后和getPwdFromPic()中获取出来的密码进行比较.

所以这道题的关键点就是从getTableFromPic()中索引出和getPwdFromPic()相同的信息. 由上表可知. "义弓么丸广之" 的索引值分别是 53 56 49 48 50 54 转成ASCII就是581026. 所以这就是这道题的密码.

第二题思路:

使用AndroidKiller 载入AliCrackme_2.apk进行分析. 发现最核心的函数就是securityCheck(), 这个函数的实现在so里面. 所以动态调试libcrackme.so. 结果发现断点总是会被跟飞. 看来是有反调试.. 通过调试, 最终确定反调试的地点是在JNI_OnLoad()中, 调用libc.so:pthread_create创建了一条反调试线程. Nop掉就安静了!

当然这是为了尽快提交答案, 所以是这样了. 我今天写分析文档的时候, 仔细跟了下细节. 原来反调试的方法是 一个死循环里面不断的读取./proc/xxx/status 文件里面的TracerPid:字段. 当TracerPid字段非空的时候就直接kill 这个进程. 也就是杀死我们的调试进程! 这样达到反调试的目的!

然后动态跟踪Java_com_yaotong_crackme_MainActivity_securityCheck 发现里面是一个非常简单的比较. 比较的目标字符串就是 aiyou,bucuoo. 所以这就是本题的正确答案.

第三题思路:

这道题的难度跟前两道差别不小. 可能是因为原来没搞过移动方面的壳. 花在dump 真实dex上很多时间. 最终的dump方法是使用gdb在 libdvm.so._Z12dexFileParsePKhji函数 中将真实的dex dump出来.

Dump出来的dex就是真实dex了. 但是重新打包到AliCrackme_3.apk依然无法运行. 使用了很多种方法, 都没法再让这个dex跑起来.. 只能硬着头皮看smali代码. 加gdb调试.
通过onClickd最终定位到核心的函数是

public void a(String paramString, Handler paramHandler)
{
    dn.b(dn.a());
    new Timer().schedule(new b(this, paramHandler, paramString), 2000L);
}

在这个定时器函数里面看到它new了e 这个类里面可以看到类似的代码

const-string v0, "s"

const-string v1, ". . ."

invoke-static {v0, v1}, Le;->a(Ljava/lang/String;Ljava/lang/String;)V

看来是建立了一张表. 用来将字符和摩斯码对应起来..

然后通过分析定时器的代码发现明文密码被加密起来了, 不像前面几道题, 明文密码出现在内存中. 这次的密文分成两段. 前两个BYTE来自 str1 = new e().a(this.c);. 后两个BYTE是类的Annotation();

byte[]arrayOfByte1=(((f)e.class.getAnnotation(f.class)).a()
    + ((f)a.class.getAnnotation(f.class)).a()).getBytes();

然后组成了密码  s5 7e 1p 根据这个, 在前面组成的字符和摩斯码对应的表里面查找相应的摩斯码, 查询结果并去掉空格是 "... _____ ____. . ..___ .__." 这就是最终的答案了!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回