AliCrackme_1

Posted 请问您今天要开台靶机吗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AliCrackme_1相关的知识,希望对你有一定的参考价值。

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

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

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

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

getTableFromPic()

getPwdFromPic

最后,tablepw 的明文内容如下

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

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

  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 的输出,最后拼出密码

函数参数

格式:

1.def show():

  print("函数参数")

ret = show()

______________________________________________________________________________________________________________________

2.def show(a1,a2,a3=100)#a3为默认参数,默认参数只能放在形式参数后面

  print(a1,a2,a3)

show(111,888)

返回(111,888,100)

______________________________________________________________________________________________________________________

3.指定参数

def show(a1,a2)

  print(a1,a2)

show(a2=50,a1=30)

返回(30,50)

______________________________________________________________________________________________________________________

4.动态参数

def show(*arg):#一个*把所有的参数转化为一个元祖

  print(arg,type(arg))

show(1,2,3,4)

返回(1,2,3,4), class(tuple))

_____________________________________________________________________________________________________________________

5.def show(**arg):#两个*把所有的参数转化为一个字典

  print(arg,type(arg))

show(k1=12,k2=21)

返回({k1:12,k2:21}), class(dict))

_____________________________________________________________________________________________________________________

6.def show(*args,**kwargs):#返回相应的模式,一个*的放在前面,两个*放后面,顺序不能颠倒

print(args,type(args)

print(kwargs,type(kwargs))

show(1,2,3,n1=18,n2=‘lgs‘)#传参数时也按顺序

返回

((1, 2, 3), <type ‘tuple‘>)
({‘n1‘: 18, ‘n2‘: ‘lgs‘}, <type ‘dict‘>)

____________________________________________________________________________________________________________________

7.def show(*args,**kwargs):

print(*argw,type(args))

print(**kwargs,type(kwargs))

l=[1,2,3,4]

d=(‘n1‘=2,‘n2‘:‘lgs‘

show(*l,**d)#必须指定*或**

返回

((1, 2, 3, 4), <type ‘tuple‘>)
({‘n1‘: 2, ‘n2‘: 4}, <type ‘dict‘>)

____________________________________________________________________________________________________________________

8.字符串格式化

li = "{0}is{1}"

res = li.format(‘lgs‘,‘studypython‘)

print(res)

返回:lgsisstudypython


______________________________________________________________________________________________________________________

9.字符串格式化

li = "{0}is{1}"

l = [‘lgs‘,‘studypython‘]

res = li.format(*l)

print(res)

返回:lgsisstudypython


______________________________________________________________________________________________________________________

10.字符串格式化

li = "{name} is {acto‘}"

d = {‘name‘:‘mike‘,‘actor‘:‘stu‘}

res = li.format(**d)

print(res)

返回

mike is stu

 

以上是关于AliCrackme_1的主要内容,如果未能解决你的问题,请参考以下文章

IDA动态调试破解AliCrackme与反调试对抗

IDA动态调试破解AliCrackme与反调试对抗

33.Python面向对象类的专有方法__iter____getitem____getattr____call____new____init__

33.Python面向对象类的专有方法__iter____getitem____getattr____call____new____init__

33.Python面向对象类的专有方法__iter____getitem____getattr____call____new____init__

HDU3584 Cube