首页
社区
课程
招聘
[原创]看雪 CTF2018.12 第五题 静态分析与其中的Bug
发表于: 2018-12-9 16:24 3143

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

HHHso 活跃值
22
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编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//