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

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

这个题是纯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. dede定义全局变量(include/common.inc.php)及调用方式

    dede定义全局变量的文件include/common.inc.php及使用   在include/common.inc.php文件里,dede定义了大量的全局变量,详细自己去看看   dede模板里 ...

  2. shell 脚本中 命令

    终端工具tput和stty是两款终端处理工具tput cols,lines,longname,cpu 100 100 输入密码时,不能让输入的内容显示出来.用stty #!/bin/bash #Fil ...

  3. BAE 环境下配置 struts2 + spring + hibernate(SSH)(三)spring&hibernate

    1.在lib中加入必要的包,导入后结果如下: lib打包下载:SSH-lib.jar  (struts2.3.1.2  spring3.0.5 hibernate3.6.10.Final) 只包含必要 ...

  4. 关于html5

    html5   是用来  将 js  和 css  结合起来 从而实现 各种功能 javascript 用来定义 html5   页面的逻辑 css 来定义 html5 中的显示样式

  5. start-tomcat7.launch

    <?xml version="1.0" encoding="UTF-8" standalone="no"?> <launc ...

  6. IOS中用模型取代字典的好处

    使用字典的坏处 一般情况下,设置数据和取出数据都是用“字符串类型的key”,编写这些key时,编译器不会有任何友情提示,需要手敲 dict[@“name”]=@“Kevin”; NSString *n ...

  7. linux安装 Android Studio详细教程,支持性较差,需要安装最新底层库内核的linux

    安装 Android Studio详细教程 libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1 jdk1.8.0_25 android-st ...

  8. oracle存储过程 --1

    一,oracle存储过程语法   1.oracle存储过程结构  CREATE OR REPLACE PROCEDURE oracle存储过程名字 (     参数1 IN NUMBER,     参 ...

  9. 数据结构(括号序列,线段树||点分治,堆):ZJOI 2007 捉迷藏

    [题目描述] Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N- ...

  10. dll文件已经引用,但using找不到命名空间

    一:问题截图 二:解决办法 1.没看到lz的代码中有Vancl.Server的dll. 2.确实有编译不过的问题,是Vancl.WindowsServices这个工程的target framework ...