-
-
[原创]看雪 CTF2018.12 第五题 静态分析与其中的Bug
-
发表于: 2018-12-9 16:24 3143
-
送分题,静态分析下即可到想要的。
ApkToolkit将apk 转 jar,jdgui瞄一眼,如图。
直接解压apk(zip),将dex拖进IDA分析。
IDA函数名称窗口 右键复制所有粘贴到notepad++,然后当前文件搜索所有onClick
我们关注 CrackMe$1_onClick@VL 地址为 0011A338
跟进函数调用(注意到0x7F00002A 在 catch Exception代码段,应该为异常输出信息,错误的象征,圈重点,这个会考)
CrackMe.a()为主要校验逻辑,前面我们注意到
0x7F00002A是错误信息的象征,所以我们应该沿着图示红线途径走。
其中 CrackMe.c() 是初始化h,i,j变量,分别将key的不同部分转为年月日信息存储再h,i,j中,
且做了一定取值限制,基本初始化逻辑如下,下述y,m,d分别对应日h,月i,年j。
y = Integer:parseInt(key.substring(0,4) m = Integer:parseInt(key.substring(4,6) d = Integer:parseInt(key.substring(6,8) def init(y,m,d): if y < 189: y = 0 if (y <=1983) or (y >= 2007): y = 0 # if (m < 1) or (m > 12): m = 0 # if (d < 1) or (d > 31): d = 0
CrackMe.d()对年月日信息进行条件约束和修改。基本逻辑如下(注意其中的 d=31,即几号可以取到31号,bug触发条件之一)
y = Integer:parseInt(key.substring(0,4) m = Integer:parseInt(key.substring(4,6) d = Integer:parseInt(key.substring(6,8) def init(y,m,d): if y < 189: y = 0 if (y <=1983) or (y >= 2007): y = 0 # if (m < 1) or (m > 12): m = 0 # if (d < 1) or (d > 31): d = 0
CrackMe.d()对年月日信息进行条件约束和修改。基本逻辑如下(注意其中的 d=31,即几号可以取到31号,bug触发条件之一)
def yymmdd(y,m,d): if y in [1989,2004]: d=31 if m in [1,4,5,7,10,11,12]: y=1999 if y <= 1994: if m in [2,6,8]: m = 3 if y >= 1996: if m in [2,6,8]: m = 9 if y == 1995: if (d > (m+2)) or (m == d): m = 6 return (y,m,d)
def yymmdd(y,m,d): if y in [1989,2004]: d=31 if m in [1,4,5,7,10,11,12]: y=1999 if y <= 1994: if m in [2,6,8]: m = 3 if y >= 1996: if m in [2,6,8]: m = 9 if y == 1995: if (d > (m+2)) or (m == d): m = 6 return (y,m,d)
后续的CrackMe.e(),CrackMe.f(),CrackMe.g()分别将约束后的日月年信息e,f,g经过b,c,d矩阵映射变换,
得到的结果相加,并与CrackMe.h()获取的k值(也做key尾部校验)相加后进入CrackMe.a(int)做最后校验。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2018-12-13 10:31
被kanxue编辑
,原因:
赞赏
他的文章
- [原创] KCTF 2022 Win. 第六题 约束与伪随机 6743
- [原创] KCTF 2021 Win. 第二题 排排坐 21170
- [原创] KCTF 2021 Win. 第一题 算力与攻击模式 4117
- 鸿蒙通识 26023
- [原创] KCTF 2021 Spr. 第二题 未选择的路 9244
看原图
赞赏
雪币:
留言: