首页
社区
课程
招聘
[原创]2019看雪CTF总决赛第三题--第三题:街机少年WP
2019-12-7 11:27 3670

[原创]2019看雪CTF总决赛第三题--第三题:街机少年WP

2019-12-7 11:27
3670

2019看雪CTF总决赛第三题--第三题:街机少年WP

迷迷糊糊地突然发现题目要关闭了,心里好慌,赶紧刚一刚。
代码都能看懂,堆一块再加上查表,不知道在算什么,把算法py模拟一下,发现可以按字节爆破,那还管什么二次剩余,还管什么算法,直接上主要代码:

def crack():
  k = []
  for pos in range(96):    
    for i1 in range(0x101):       
      if i1 == 0x100:
        flag = False
        break      
      table_32 = [ 0x09, 0x1A, 0x0D, 0x04, 0x1F, 0x3E, 0x28, 0x47, 0x4B, 0x6F, 
        0x7D, 0x85, 0xA5, 0xCE, 0xFF, 0x05, 0x24, 0x4B, 0x6A, 0x8C, 
        0xA7, 0xE6, 0x19, 0x56, 0x6B, 0xB6, 0xC0, 0x04, 0x48, 0x8B, 
        0xC4, 0x14, ]
      t = [ 0x03,0x07,0x07,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x05,0x06,0x07,0x0E,0x0F,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,]
      n1 = get_n1((0x4b%16)+1)  
      idx = 5
      key = k+[i1,0]
      for i in range(len(key)-1):
        flag = True
        a = (key[i]&0xf)+1
        b = ((key[i]>>4)&0xf)+1
        flag1 = 0
        if n1 and a != 0 and b != 0 and a <=16 and b <= 16:
          a,_ = get_n2(n1,a)
          tmp = get_n1(a)
          b,flag1 = get_n2(tmp,b)      
        else:
          flag = False
          break    
        if flag1:
          flag = False
          break
        n1 = get_n1(b)
        v48 = b*table_32[t[a-1]-b]
        for j in range(a,128):
          v4 = 1 if t[j] == 0 else 0
          v5 = (v4+table_4096[fun1(t[a-1],t[j],b)])*v48
          tmp = 1 if v5 != 0 else 0
          v48 = ((v5+1)&tmp)+v5
        t[a-1] += (2*((v48+1)&1)-1)*b
        if not v48:
          flag = False
          break        
        if set(t) == {0} and i == pos:
          flag = True
          break
        c = (key[i+1]&0xf)+1
        d = ((key[i]>>4)&0xf)+1
        table_32[d/2] += c
        table_32[d/2] = (table_32[d/2]%127)+1
        tmp = table[(t[2]+t[1]+t[0])%16 | 16*t[2] | t[1]<<8 | t[0]<<12]
        tmp = table[(t[4]+t[3]+tmp)%16 | 16*t[4] | t[3]<<8 | tmp<<12]
        tmp = table[(t[6]+t[5]+tmp)%16 | 16*t[6] | t[5]<<8 | tmp<<12]
        tmp = table[(t[8]+t[7]+tmp)%16 | 16*t[8] | t[7]<<8 | tmp<<12]
        tmp = table[(t[10]+t[9]+tmp)%16 | 16*t[10] | t[9]<<8 | tmp<<12]
        tmp = table[(t[12]+t[11]+tmp)%16 | 16*t[12] | t[11]<<8 | tmp<<12]
        tmp = table[(t[14]+t[13]+tmp)%16 | 16*t[14] | t[13]<<8 | tmp<<12]
        if tmp:
          flag = False
          break
#          for j in range(15):
#            if table_256[tmp|16*t[j]]&1:
#              t[j] = table_256[tmp|16*t[j]] >> 1
#              break
        else:          
          while t[idx] == 0:
            idx = (idx+4)%15
          if t[idx] == 1:
            t[idx] -= 1
          else:
            t[idx] -= (idx*idx+1)%t[idx]+1  
          idx = (idx+4)%15          
          for x in t[:15]:
            if x < 0:
              flag = False
          if flag and i == pos:            
            break
      if flag and i == pos:
        k = key[:-1]
        print k,t[:15]
        break
    if not flag:
      print 'error'
      exit(0)
    if set(t) == {0}:
      break
  print enbase1(''.join(map(chr,k)))

def fun1(a,b,c):
  t1 = (b>>2)^16*c&0xc0^4*a&0x3c^0xc7
  t2 = (c&3^4*b)&0xf^2
  return t2<<8|t1

def get_n1(n):
  b = n
  a = b
  while True:
    a = b
    for i in range(1,16):
      c = a
      d = b
      if a > b:
        c = b
        d = a
      a = c*c % 17 ^ table_xor[d+(c-1)*(34-c)/2-c]
      if a == 1 and i != 15:
        b = (b+1)%16+1
        a = 0
        break
    if a == 1:
      break
  return b 

def get_n2(m,n):
  count = 0
  a = m
  b = m
  for i in range(1,n):
    c = a
    d = b
    if a > b:
        c = b
        d = a
    a = c*c % 17 ^ table_xor[d+(c-1)*(34-c)/2-c]
    if a == 1 and i != n-1:
      count += 1
  return a,count

def enbase1(s):
  l1 = len(s)/3
  l2 = len(s)%3
  r = ''
  for i in range(l1):
    a = ord(s[3*i])
    b = ord(s[3*i+1])
    c = ord(s[3*i+2])    
    r += chr((a>>2)+58)
    r += chr((((a&0x3)<<4)|b>>4)+58)
    r += chr((b&0xf)+(c>>2&0x30)+58)
    r += chr((c&0x3f)+58)
  if l2 == 1:
    a = ord(s[3*l1])
    r += chr((a>>2)+58)
    r += chr(((a&0x3)<<4)+58)
    r += 'z'
    r += 'z'
  if l2 == 2:
    a = ord(s[3*l1])
    b = ord(s[3*l1+1])
    r += chr((a>>2)+58)
    r += chr((((a&0x3)<<4)|b>>4)+58)
    r += chr((b&0xf)+58)
    r += 'z'    
  return r
crack()

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞1
打赏
分享
最新回复 (1)
雪    币: 19
活跃值: (128)
能力值: ( LV9,RANK:146 )
在线值:
发帖
回帖
粉丝
wendax 2019-12-11 17:45
2
0
游客
登录 | 注册 方可回帖
返回