今天在网上看到了阿里移动安全比赛的第一次,并且说难度不大,便拿来看了看。

主体就是找出一个密码输进去,然后看正误。

这个题是纯Java层的一个题,也没用进行什么保护。可以直接反编译。

登陆Button的点击事件大致思路如下:

 1 void onclick(View view){
 2         EditText editText = (EditText) findViewByID(R.id.exit);
 3         String inputStr = editText.getText().toString();
 4         String tableStr = MainActivity.this.getTableFromPic();
 5         String pwStr = MainActivity.this.getPwdFromPic();
 6         Log.i("lil", "table:" + tableStr);
 7         Log.i("lil", "pw:" + pwStr);
 8         String enPassword=  MainActivity.bytesToAliSmsCode(tableStr,inputStr.getBytes("utf-8"));
 9         Log.i("lil", "enPassword:" + enPassword);
10         if(outPw.equals(pwStr)){
11             正确
12         }
13     }

可以看到关键的方法有3个:getTableFromPic()、getPwdFromPic()和bytesToAliSmsCode()。题目本身就给出来了关键位置的log输出,这样可以直接查看了。

而且多次点击之后发现只有enPassword改变,table和pw是不变的。所以我们关心的函数应该放在bytesToAliSmsCode()这个函数上。

它有两个参数,第一个是table,第二个是我们输入的inputStr的字节数组,它的返回值就是enPassword。接下来看一下这个函数的实现:

 private static String bytesToAliSmsCode(String tableStr, byte[] inputs)
     {
         StringBuilder localStringBuilder = new StringBuilder();
         for (int i = 0;i < inputs.length;++i)
         {
             localStringBuilder.append(tableStr.charAt(inputs[i] & 0xFF));
         }
         return localStringBuilder.toString();
     }

可以看到,这个enPassword的产生不就是根据我们输入String的字节数组的每个元素,按照查表的方式进行字符串的拼接,然后返回吗。只不过对每个input[i]进行了一个与操作。

这样,根据pw为一个六字数组我们可以判定我们输入String化为字节数组后长度也为6,这样我们就可用穷举的方式进行逐位爆破。

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

比如对第一位“义”来说,哪一个byte经过&0xFF之后在密码表里的值为义。我们从byte的最小值遍历到最大值,找到之后就保存起来,然后再找第二位,依次下去。

换一个角度来说

一个byte & 0xFF的值是什么?

一个byte占8个字节。0xFF也是8个字节,它的二进制表示为11111111(8个)。

对于与操作,两个二进制都为1结果才为1,比如 1 & 1 = 1 , 1 & 0 = 0 , 0 & 0 = 0;

那么一个byte & 0xFF ,不论这个byte是几,进行按位与之后仍为它本身。

那么第二种解法就是:

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

两个结果是一样的。

总的来说这个题非常简单,但是也能体现出对密码这类问题的两种解决办法

1、逐位爆破,用穷举的方式一个一个算

2、把它的加密算法逆回去

2015移动安全挑战赛(阿里&看雪主办)第一题分析的更多相关文章

  1. 看雪论坛 破解exe 看雪CTF2017第一题分析-『CrackMe』-看雪安全论坛

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 逆向 黑客 破解 学习 论坛 『CrackMe』 http://bbs.pediy.co ...

  2. 看雪.TSRC 2017CTF秋季赛第三题

    看雪.TSRC 2017CTF秋季赛第三题 wp 这是一道很简单的题,反调试的坑略多.这道题采用了很多常用的反调试手段,比如调用IsDebuggerPresent.进程名检查等等.另外也有利用SEH的 ...

  3. ECC加密算法入门介绍 --- 看雪

    标 题:ECC加密算法入门介绍 作 者:zmworm 时 间:2003/05/04 08:32pm 链 接:http://bbs.pediy.com ECC加密算法入门介绍 作者  :ZMWorm[C ...

  4. 看雪CTF第十题

    __int64 sub_140006F50() { __int64 v0; // r8@1 __int64 v1; // r9@1 signed __int64 len; // rax@1 __int ...

  5. 如何实现 Https拦截进行 非常规“抓包” 珍惜Any 看雪学院 今天 前段时间在自己做开发的时候发现一个很好用的工具,OKHttp的拦截器(何为拦截器?就是在每次发送网络请求的时候都会走的一个回调)大概效果如下:

    如何实现 Https拦截进行 非常规“抓包” 珍惜Any 看雪学院 今天 前段时间在自己做开发的时候发现一个很好用的工具,OKHttp的拦截器(何为拦截器?就是在每次发送网络请求的时候都会走的一个回调 ...

  6. 看雪hello

    在看雪做了一道题目很简单,但是还是记录一下自己的学习. 用ida打开,然后shift+F12查看 这里可以看到基本的结构,转到pass查看 发现ATA XREF: sub_401770+Bo打开这里 ...

  7. 2019看雪CTF 晋级赛Q2第四题wp

    上次参加2019看雪CTF 晋级赛Q2卡在了这道题上,虽然逆出算法,但是方程不会解,哈哈哈哈,果然数学知识很重要呀,现在记录一下. 首先根据关键信息,根据错误提示字符串定位到这里: 1 int __t ...

  8. 腾讯2021LIGHT公益创新挑战赛赛题分析

    前些日子老师让我们报名了LIGHT挑战赛,之后又简单的进行了分析,今天我总结复盘一下,一是为了捋一下自己选题的思路,二是以后遇见类似的项目,更容易找到方向或者触类旁通. 赛题介绍 赛题一:安全教育/保 ...

  9. 2015年3月阿里内推(c++研发)实习生电面经历

    2015年3月开学开始就听说阿里会有内推,果不其然在师兄的引荐下推了菜鸟网络,但是在学校的BBS上看到了阿里云部门,而且要会C++,这使我更感兴趣,重新选择了方向,当然最后选择了阿里云.在此分享一下三 ...

随机推荐

  1. MVC Unit Testing学习笔记

    MVC Unit Testing 参考文档: 1.http://www.asp.net/mvc/overview/testing 2.http://www.asp.net/mvc/tutorials/ ...

  2. JS自执行函数的几种写法

    一:整体写在一个括号中 代码如下: (function Show(){alert("hello");}()) 二:function函数整体外加括号 代码如下: (function ...

  3. Grnymotion模拟器和Android真机访问PC端Tomcat下的应用

    最近因为要学安卓与服务器交互的知识,所以必须要让android程序能访问一个测试服务器.所以我就考虑让真机或者模拟器访问PC端的Tomcat或者Apache服务. 在介绍步骤之前,有必要说点基础的.我 ...

  4. windows 下PHP 和 nginx配置

    http://www.cnblogs.com/huayangmeng/archive/2011/06/15/2081337.html

  5. KVO初探

    一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应 ...

  6. ExtJS 4 树

    Tree Panel是ExtJS中最多能的组件之一,它非常适合用于展示分层的数据.Tree Panel和Grid Panel继承自相同的基类,所以所有从Grid Panel能获得到的特性.扩展.插件等 ...

  7. BZOJ 1036 树的统计

    Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...

  8. My ECMAScript 7 wishlist

    With ECMAScript 6 now feature complete, any further changes to the core of JavaScript will happen in ...

  9. QVariant(相当于是Java里面的Object,起到一个数据类型“擦除”的作用,可以使用Q_DECLARE_METATYPE进行注册)

    =QVariant= [%这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用.比如我们的 table单元格可以是string,也可以是 ...

  10. 【宽搜】BAPC2014 J Jury Jeopardy (Codeforces GYM 100526)

    题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...