Loading

AliCrackme_1

首先分析程序入口的 Activity 源码

image-20230412142930642

关键部分已经圈出来了,代码的逻辑如下

  1. 调用 getTableFromPic()getPwdFromPic() 方法获得 table 密码表和 pw 密码明文,
  2. 将输入的内容使用 bytesToAliSmsCode() 方法进行编码
  3. 判断编码后的内容是否等于 pw 密码

因为 passwordpw 变量的东西都在 logcat 里打印了,所以没有什么分析这两个方法的必要。不过还是罗列一下这两个方法的逻辑

getTableFromPic()

image-20230412143417376

getPwdFromPic

image-20230412143451076

最后,tablepw 的明文内容如下

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

然后就要分析 bytesToAliSmsCode() 方法了,代码逻辑如下

image-20230412143921772

  1. 经过了一个位运算,找出输入的内容在密码表 table 中的位置
  2. 加到 sb
  3. 返回 sb

然后,还原一下 pw 的编码过程

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

最后输出为 581026,即为 flag。这里也可以手打 0-9 的数字,观察 logcat 的输出,最后拼出密码

posted @ 2023-04-12 14:50  20206675  阅读(22)  评论(0编辑  收藏  举报