首页
论坛
课程
招聘
[原创]看雪 CTF2018.12 第五题 静态分析与其中的Bug
2018-12-9 16:24 1486

[原创]看雪 CTF2018.12 第五题 静态分析与其中的Bug

HHHso 活跃值
22
2018-12-9 16:24
1486

送分题,静态分析下即可到想要的。

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












【公告】 [2022大礼包]《看雪论坛精华22期》发布!收录近1000余篇精华优秀文章!

最后于 2018-12-13 10:31 被kanxue编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回