-
-
[原创]看雪CTF·TSRC团队赛第五题-交响曲
-
发表于: 2018-12-10 10:47 2921
-
(有些地方比较详细,大佬请绕过~)
先跑起应用,大概了解下题目思路







⑤编写代码,跑出结果

还是惯例,要求输入一串字符,通过程序计算比对,输出比对结果。
接下来,查看程序逻辑,将apk文件拖入jeb进行反编译:

可以看到该apkdex文件结构很简单,只包含了一个自定义类,右键decompile,查看代码逻辑:
①打开后可以发现dex经过了Proguard混淆,所以需要变分析边修改函数及变量名,以便于帮助分析。
②熟悉Android看法的都应该知道,按钮的点击监听函数,command+F搜索“click”关键字,目的是找到“验证”按钮的onClick方法,如下图所示:

③可以发现目标方法并不是native方法,只需要逆向java代码就OK。接着抽丝剥茧,一步步理清代码逻辑

输入函数getInput(),获取EditText输入,对前八位分段处理,前四位,中两位,后两位分别转成int,复制給成员变量sub2Int_1、sub2Int_2、sub2Int_3。并且根据限定条件可以推出三个数的取值范围:sub2Int_1 ->(1983,2007),sub2Int_2 ->[1,12],sub2Int_3 ->[1,31]

tansform1()函数对三个数的值进行一次变换:

sub2Int_1_t_m()、sub2Int_2_t_m()、sub2Int_3_t_m()对三个数的值进行二次变换,并以变换后的值作为数组下标,分别取int数组d,c,b中的值

transform2()函数对剩余的字符串进行约束即是否在String数组_to_Arr中,并返回以_to_Arr的下标取int数组a中的值。(在此就可以大概推出sub2Int_2_t的值为2,返回k的值是有限个)

i34()进行最后的计算和输出,可以推出传入的参数I的值==34,即sub2Int_1_t_m + sub2Int_2_t_m + sub2Int_3_t_m + transform2 == 34

④总结一下:
1 | """<br>已知:<br>sub2Int_1 = str(mStr[0:4])<br>sub2Int_2 = str(mStr[4:6])<br>sub2Int_3 = str(mStr[6:8])<br><br>sub2Int_1 ->(1983,2007)<br>sub2Int_2 ->[1,12] <br>sub2Int_3 ->[1,31]<br><br>transform1()变换Int_1,sub2Int_2,sub2Int_3,且由transform2()可知变换后的sub2Int_2的值应该为2<br><br>sub2Int_1_t_m + sub2Int_2_t_m + sub2Int_3_t_m + transform2 == 34;<br><br>transform2()返回的是以剩余字符串早to_arr[]数组中下标取a[]中的值<br><br>求:sub2Int_1,sub2Int_2,sub2Int_3,a[]下标<br><br>""" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | class Getoutofloop(Exception): pass mStr = '' def sub2Int_1_t_m(sub2Int_1_t): return d[(sub2Int_1_t - 1900 ) % 60 ] def sub2Int_2_t_m(sub2Int_2_t): return c[(sub2Int_2_t - 1 )] def sub2Int_3_t_m(sub2Int_3_t): return b[(sub2Int_3_t - 1 )] def transform2(): subStr = mStr[ 8 : len (mStr)] # 除去前8位 i = 0 kk = 0 while ( True ): if (i > = len (to_arr)): break elif (subStr = = to_arr[i]): # 除'11to13' if (sub2Int_2_t = = 2 and subStr = = to_arr[ 6 ]): return 63 kk = a[i] else : i = i + 1 return kk def transform1(sub2Int_1, sub2Int_2, sub2Int_3): if (sub2Int_1 = = 1989 or sub2Int_1 = = 2004 ): sub2Int_3 = 31 if (sub2Int_2 = = 1 or sub2Int_2 = = 4 or sub2Int_2 = = 5 or sub2Int_2 = = 7 or sub2Int_2 = = 10 or sub2Int_2 = = 11 or sub2Int_2 = = 12 ): sub2Int_1 = 1999 if (sub2Int_1 < = 1994 and (sub2Int_2 = = 2 or sub2Int_2 = = 6 or sub2Int_2 = = 8 )): sub2Int_2 = 3 if (sub2Int_1 > = 1996 and (sub2Int_2 = = 2 or sub2Int_2 = = 6 or sub2Int_2 = = 8 )): sub2Int_2 = 9 if (sub2Int_1 = = 1995 and (sub2Int_3 > sub2Int_2 + 2 or sub2Int_2 = = sub2Int_3)): sub2Int_2 = 6 return sub2Int_1, sub2Int_2, sub2Int_3 if __name__ = = '__main__' : print ( 'd.length=' , len (d)) print ( 'c.length=' , len (c)) print ( 'b.length=' , len (b)) print ( 'to_arr.length=' , len (to_arr)) result = [] # tmp = [1983,1984,1985,1986,1987,1988,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2005,2006] try : for i in range ( 1984 , 2007 ): #sub2Int_1 for j in range ( 1 , 13 ): #sub2Int_2 for k in range ( 1 , 32 ): #sub2Int_3 for m in range ( len (a)): sub2Int_1_t, sub2Int_2_t, sub2Int_3_t = transform1(i, j, k) if sub2Int_3_t = = 31 : break m1 = (sub2Int_1_t - 1900 ) % 60 m2 = sub2Int_2_t - 1 m3 = sub2Int_3_t - 1 print (m1,m2,m3) if (d[m1] + c[m2] + b[m3] + a[m]) = = 34 : print (d[m1],c[m2],b[m3],a[m]) print ( 'i=' ,i, 'j=' ,j, 'k=' ,k, 'to=' ,m) result.append((i,j,k,m)) except Getoutofloop: pass print (result) |
得到结果:[(1995, 2, 3, 3), (1995, 2, 3, 6)],排除第二个结果,将第一取对应字符串拼接得到结果:1995020305to07

还是惯例,要求输入一串字符,通过程序计算比对,输出比对结果。
接下来,查看程序逻辑,将apk文件拖入jeb进行反编译:

可以看到该apkdex文件结构很简单,只包含了一个自定义类,右键decompile,查看代码逻辑:
①打开后可以发现dex经过了Proguard混淆,所以需要变分析边修改函数及变量名,以便于帮助分析。
②熟悉Android看法的都应该知道,按钮的点击监听函数,command+F搜索“click”关键字,目的是找到“验证”按钮的onClick方法,如下图所示:

③可以发现目标方法并不是native方法,只需要逆向java代码就OK。接着抽丝剥茧,一步步理清代码逻辑

输入函数getInput(),获取EditText输入,对前八位分段处理,前四位,中两位,后两位分别转成int,复制給成员变量sub2Int_1、sub2Int_2、sub2Int_3。并且根据限定条件可以推出三个数的取值范围:sub2Int_1 ->(1983,2007),sub2Int_2 ->[1,12],sub2Int_3 ->[1,31]

tansform1()函数对三个数的值进行一次变换:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2022-7-27 01:52
心游尘世外
为你点赞~
2022-7-26 23:50
飘零丶
为你点赞~
2022-7-17 03:24
赞赏
赞赏
雪币:
留言: