2015移动安全挑战赛(阿里&看雪主办)第一题分析
今天在网上看到了阿里移动安全比赛的第一次,并且说难度不大,便拿来看了看。

主体就是找出一个密码输进去,然后看正误。
这个题是纯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移动安全挑战赛(阿里&看雪主办)第一题分析的更多相关文章
- 看雪论坛 破解exe 看雪CTF2017第一题分析-『CrackMe』-看雪安全论坛
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 逆向 黑客 破解 学习 论坛 『CrackMe』 http://bbs.pediy.co ...
- 看雪.TSRC 2017CTF秋季赛第三题
看雪.TSRC 2017CTF秋季赛第三题 wp 这是一道很简单的题,反调试的坑略多.这道题采用了很多常用的反调试手段,比如调用IsDebuggerPresent.进程名检查等等.另外也有利用SEH的 ...
- ECC加密算法入门介绍 --- 看雪
标 题:ECC加密算法入门介绍 作 者:zmworm 时 间:2003/05/04 08:32pm 链 接:http://bbs.pediy.com ECC加密算法入门介绍 作者 :ZMWorm[C ...
- 看雪CTF第十题
__int64 sub_140006F50() { __int64 v0; // r8@1 __int64 v1; // r9@1 signed __int64 len; // rax@1 __int ...
- 如何实现 Https拦截进行 非常规“抓包” 珍惜Any 看雪学院 今天 前段时间在自己做开发的时候发现一个很好用的工具,OKHttp的拦截器(何为拦截器?就是在每次发送网络请求的时候都会走的一个回调)大概效果如下:
如何实现 Https拦截进行 非常规“抓包” 珍惜Any 看雪学院 今天 前段时间在自己做开发的时候发现一个很好用的工具,OKHttp的拦截器(何为拦截器?就是在每次发送网络请求的时候都会走的一个回调 ...
- 看雪hello
在看雪做了一道题目很简单,但是还是记录一下自己的学习. 用ida打开,然后shift+F12查看 这里可以看到基本的结构,转到pass查看 发现ATA XREF: sub_401770+Bo打开这里 ...
- 2019看雪CTF 晋级赛Q2第四题wp
上次参加2019看雪CTF 晋级赛Q2卡在了这道题上,虽然逆出算法,但是方程不会解,哈哈哈哈,果然数学知识很重要呀,现在记录一下. 首先根据关键信息,根据错误提示字符串定位到这里: 1 int __t ...
- 腾讯2021LIGHT公益创新挑战赛赛题分析
前些日子老师让我们报名了LIGHT挑战赛,之后又简单的进行了分析,今天我总结复盘一下,一是为了捋一下自己选题的思路,二是以后遇见类似的项目,更容易找到方向或者触类旁通. 赛题介绍 赛题一:安全教育/保 ...
- 2015年3月阿里内推(c++研发)实习生电面经历
2015年3月开学开始就听说阿里会有内推,果不其然在师兄的引荐下推了菜鸟网络,但是在学校的BBS上看到了阿里云部门,而且要会C++,这使我更感兴趣,重新选择了方向,当然最后选择了阿里云.在此分享一下三 ...
随机推荐
- 干掉Google字体,WordPress速度暴涨
2014年7月7日23:40:31 因为Google被墙,WordPress引用的Google字体总会加载很长时间,严重影响打开速度. 安装WordPress插件 Disable Google Fon ...
- MySQL中删除重复数据只保留一条
用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 SELECT ...
- 局部变量存储区域静态变量存储区域static变量存储区域
局部变量存储区域静态变量存储区域static变量存储区域 常见的存储区域可分为: 1.栈 由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等. 2.堆 ...
- RabbitMQ启动出错:- unable to connect to epmd on xxxx: timeout (timed out)
yum install后启动rabbitmq报错: [root@www ~]# /etc/init.d/rabbitmq-server start Starting rabbitmq-server: ...
- Ubuntu下安装和配置Apache2
http://www.blogjava.net/duanzhimin528/archive/2010/03/05/314564.html 在Ubuntu中安装apache 安装指令:sudo apt- ...
- c# 绘图常用对象和方法
//BitMap 位图,常用的方法, Save:主要方式有:(1)保存在图像文件里,可以指定格式[gif,bmp]:(2) 保存在流中,以指定格式[gif,bmp] //gra ...
- 【HDOJ】3345 War Chess
简单BFS.注意最后一组数据,每个初始点不考虑周围是否有敌人. /* 3345 */ #include <iostream> #include <cstdio> #includ ...
- bzoj1146
这是一道无比繁琐的题目话说这道题使我第一次练dfs序,比较感动:首先dfs序就是在dfs过程中按照访问的顺序给每个点标上两个“时间戳”一个是第一次访问到点i时的时间戳c[i],一个是访问完以i为根时的 ...
- (转载)调用ob_end_flush()网页仍旧不能显示有关问题
(转载)http://www.myexception.cn/php/558638.html 调用ob_end_flush()网页仍旧不能显示问题?写了一个简单的demo,理论上调用ob_end_flu ...
- 安装robotframework时提示权限受限
mba下准备装robotframework,python已默认装好,按照如下的教程继续按照robotframework,发现会提示权限受限,如图. 第二步: 安装 robotframework下载地址 ...