본문 바로가기

카테고리 없음

picoCTF 2018 keygen-me-2 Write up

z3 쓰는 괜찮은 문제인거같아서 가져왔다

리버싱 공부좀 해야지

 

이거보면 return 이 대충 0부터 시작하고 35까지 하는걸 알수 있다.

 

이 스테이지 전부다 통과해야되니까

결국 z3돌리라는 말이다.

 

from z3 import *

def m(a, b):
      return If(a % b >= 0,
    a % b,
    a % b + b)

s = Solver()

v = []
for i in range(16):
  e = Int('v'+str(i))
  v.append(e)
  s.add(e >= 0)
  s.add(e <= 35)

s.add(m(v[0] + v[1], 36) == 14)
s.add(m(v[2] + v[3], 36) == 24)
s.add(m(v[2] - v[0], 36) == 6)
s.add(m(v[1] + v[3] + v[5], 36) == 4)
s.add(m(v[2] + v[4] + v[6], 36) == 13)
s.add(m(v[3] + v[4] + v[5], 36) == 22)
s.add(m(v[6] + v[8] + v[10], 36) == 31)
s.add(m(v[1] + v[4] + v[7], 36) == 7)
s.add(m(v[9] + v[12] + v[15], 36) == 20)
s.add(m(v[13] + v[14] + v[15], 36) == 12)
s.add(m(v[8] + v[9] + v[10], 36) == 27)
s.add(m(v[7] + v[12] + v[13], 36) == 23)

print(s.check())

z3 짤때 다른 블로그 참고를 많이 했다. 아닌가 그냥 그대로 갖고왔다. 이것밖에 좋은게 없네

 

values = [31, 19, 1, 23, 1, 34, 11, 23, 8, 7, 12, 0, 16, 20, 31, 33]

output = ''
for i in range(0, 16):
  v = values[i]
  print v
  if v < 10:
    output += chr(v+0x30)
  else:
    output += chr(v+0x37)

print output

그래서 z3 나온값으로 다시 문자열 복구시켜주면 된다.

 

이게 z3다 보니까 output이 전부다 다를 수 있다.