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++,这使我更感兴趣,重新选择了方向,当然最后选择了阿里云.在此分享一下三 ...
随机推荐
- 一起来背ABC
construction 构造,结构 constructor 构造函数,施工员
- BIOS中断大全
BIOS中断大全 BIOS中断:1.显示服务(Video Service——INT 10H) 00H —设置显示器模式0CH —写图形象素01H —设置光标形状0DH —读图形象素02H —设置光标 ...
- jQuery--效果和遍历
七.jQuery效果 (1)jQuery隐藏和显示 //隐藏 $("#hide").click(function(){ $("p").hide(1000); } ...
- cocod2d-x 之 CCDirector、CCScene、CCSprite
CCDirector是控制游戏流程的主要组件. typedef enum { /// sets a 2D projection (orthogonal projection)2D投机模式 kCCDir ...
- YII 验证邮箱和QQ号码
//验证邮箱非空,和邮箱格式 //验证邮箱非空,和邮箱格式 array("email","e ...
- python模块之re正则表达式
41.python的正则表达式 1. python中re模块提供了正则表达式相关操作 字符: . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \W大写代表非\w ...
- Webservices-1.web服务定义简介
一.WEB服务定义(摘自维基百科)详情:http://zh.wikipedia.org/wiki/Web%E6%9C%8D%E5%8A%A1 Web服务是一种服务导向架构的技术,通过标准的Web协议提 ...
- android的padding和margin的区别
android:padding和android:layout_margin的区别:padding是站在父view的角度描述问题,它规定它里面的内容必须与这个父view边界的距离. margin则是站在 ...
- BZOJ 1013 球形空间产生器
Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁 ...
- Reducing the Dimensionality of data with neural networks / A fast learing algorithm for deep belief net
Deeplearning原文作者Hinton代码注解 Matlab示例代码为两部分,分别对应不同的论文: . Reducing the Dimensionality of data with neur ...