首页
社区
课程
招聘
[原创]2015年移动安全挑战赛解题思路(1、2、3题)
2015-1-25 20:53 2199

[原创]2015年移动安全挑战赛解题思路(1、2、3题)

2015-1-25 20:53
2199
第一题:
纯java代码,看java代码即可。直接拉到jeb里。
关键代码:
    private static String bytesToAliSmsCode(String table, byte[] data) {
        StringBuilder v1 = new StringBuilder();
        int v0;
        for(v0 = 0; v0 < data.length; ++v0) {
            v1.append(table.charAt(data[v0] & 255));
        }

        return v1.toString();
    }
....
String v2 = MainActivity.bytesToAliSmsCode(v5, v3.getBytes("utf-8"));
....
    if(v4 == null || (v4.equals("")) || !v4.equals(v2)) {  ....

所以v4 =v2 即可正确解题。
V3  可根据V4,V5反解出来。V4,V5已经日志打印出来了。

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

Result :581026

第二题:
丢到jeb,java层代码很干净,关键逻辑在这里:
MainActivity.this.securityCheck(MainActivity.this.inputCode.getText().toString())

这个在Native层的关键逻辑在这里:
 v5 = (*(int (__fastcall **)(int, int, _DWORD))(*(_DWORD *)v3 + 676))(v3, v4, 0);
//这个看了半天,当时没看明白,后来才查了一下,JNIEnv+676 就是GetStringUTFChars 
  v6 = off_628C;
  while ( 1 )  //这里按字节比较off_628C 处的字符串和输入字符串是否相同。
  {
    v7 = (unsigned __int8)*v6;
    if ( v7 != *(_BYTE *)v5 )
      break;
    ++v6;
    ++v5;
    v8 = 1;
    if ( !v7 )
      return v8;
  }

“off_628C”的值在静态分析中是“wojiushidaan”,这个是不行的,可能是动态运行时改了逻辑或者改了off_628C的值。可以修改上面的print函数直接打印出来,或者去运行内存里看看,或者静态分析改动的逻辑。我选择了最快的第二个方案。 gdb动态attach到pid下的某个task(直接attach进程号有反调试)。dump so附近的一块内存下来之后,直接strings dump.so 
aiyou,bucuoo   一看就是了(符合出题者一贯猥琐的特点),提交,成功。

第三题:
分两步,1:重建dex文件。2:分析dex文件。
1.libmobisecy.so 是一个不完整的odex文件,应该把Methods的实现隐藏了,可能是在libmobisecz.so 里。逻辑完整的odex文件在内存里。
动态调,在反调试生效前,odex已经还原好了。在ibdvm的Z14dvmDefineClassP6DvmDexPKcP6Object 下了个断点,通过参数DvmDex的指针,dump下整个odex。baksmali还原。
java -jar baksmali.jar  -d ./framework/ -a 12  -x ~/Desktop/120.dex 
然后smali.jar重建dex 文件,丢给jeb ,之前要删掉几个会让jeb报错的方法。
Ldn;.testdex2jarcrash(Ljava/lang/String;Ljava/lang/String;)
Ldn;.<init>()V]
Ld;.<init>(Lcrackme/a3/Main;Landroid/widget/EditText;)V

2.然后jeb分析。
过程有几个坑,绕来绕去的。
一共6位,
前两位是:hashcode为3618,且ASCII码和为168的字符串,是:s5
                v0_6 = v5.substring(0, 2).hashCode();
                  .....
                if(v0_6 == 3618) {
                    if(v1_6[0] + v1_6[1] != 168) {
                        goto label_171;
                    }
后四位是:byte[] v5_1 = e.class.getAnnotation(f.class).a() + a.class.getAnnotation(f.class).a().getBytes();  //够猥琐

最后把这6为再用class e中的函数做一下莫尔斯码转换,空格隔开。

阿里云助力开发者!开发者可享99元/年,续费同价!企业可享99元/199元双重权益

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