-
-
[原创]看雪 CTF2018.12 第五题 静态分析与其中的Bug
-
2018-12-9 16:24 2493
-
送分题,静态分析下即可到想要的。
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触发条件之一)
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)做最后校验。
key尾部数据只是m的取值之一,CrackMe.h() 会取得其在m中的索引ki,并在a矩阵中取得k=a[ki]值。
其中要求修正的月份为2,还要求key尾部不等于m[6],即
09to11
m = { "23to01", "01to03", "03to05", "05to07", "07to09", "09to11", "11to13", "13to15", "15to17", "17to19", "19to21", "21to23" };
CrackMe.a(int) 要求累加和等于0x22
于是简单枚举下就可得到结果,
其中b,追加了个尾数0,否则day取31时,我们会索引溢出异常。放在真机中就是访问越界,这就是bug所在(day可取31,但b只有30的长度)
因为静态分析b[30]位置值未知,
bug会不会导致多解也就未知。
k值直接不小心取了a[6]=10,因为开始没注意到其尾部要求不能是m[6]=
09to11,而看成了要求为m[6],此时k值为10
所以当提交1995020309to11时提示错误。
后来察觉要求是不能为m[6]= 09to11,本来是要在yy,mm,dd = yymmdd(...)调用后枚举多个k值(a矩阵取值集合范围)。
但一眼放过去a中k=10的位置还有一个位a[3]==a[6]==10,所以直接修正为m[3]=
05to07后
提交
1995020305to07 提示正确
a = [ 16, 6, 7, 10, 9, 16, 10, 8, 8, 9, 6, 6 ] b = [ 5, 10, 8, 15, 16, 15, 8, 16, 8, 16, 9, 17, 8, 17, 10, 8, 9, 18, 5, 15, 10, 9, 8, 9, 15, 18, 7, 8, 16, 6,0 ] c = [ 6, 7, 18, 9, 5, 16, 9, 15, 18, 8, 9, 5 ] d = [ 7, 7, 9, 12, 8, 7, 13, 5, 14, 5, 9, 17, 5, 7, 12, 8, 8, 6, 19, 6, 8, 16, 10, 6, 12, 9, 6, 7, 12, 5, 9, 8, 7, 8, 15, 9, 16, 8, 8, 19, 12, 6, 8, 7, 5, 15, 6, 16, 15, 7, 9, 12, 10, 7, 15, 6, 5, 14, 14, 9 ] for yr in range(1983+1,2007): for mr in range(1,12+1): for dr in range(1,31+1):#no 31 yy,mm,dd = yymmdd(yr,mr,dr) if mm==2 and (d[(yy-1900)%60]+c[mm-1]+b[dd-1]+10)==0x22: print yr,mr,dr
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
最后于 2018-12-13 10:31
被kanxue编辑
,原因:
赞赏
他的文章
鸿蒙通识
23082
看原图