HSCTF 8 | Cyanocitta Cristata Cyanotephra

#hsctf8

import random
var("x y")
flag = int(open('flag.txt','rb').read().hex(),16)
xs = [random.randint(1,256) for i in range(9)]
ys = [random.randint(1,256) for i in range(9)]
assert not any([xs[i]==ys[i] for i in range(9)])
c = [random.randint(1,2^64) for i in range(len(xs))]
f(x,y)=c[0]*x^2+c[1]*y^2+c[2]*x*y+c[3]*x+c[4]*y+c[5]
solns = [int(f(xs[i],ys[i])) for i in range(len(xs))]
print([(xs[i],ys[i],solns[i]) for i in range(9)])
a,b = random.randint(1,2^40),random.randint(1,2^40)
print(a,b)
print((int(f(a,b)))^^flag)

やるだけ

import ast
import random

with open("output.txt") as f:
    vals = ast.literal_eval(f.readline().strip())
    a, b = [int(x) for x in f.readline().strip().split(" ")]
    flag = int(f.readline().strip())

xs, ys, solns = [v[0] for v in vals], [v[1] for v in vals], [v[2] for v in vals]

c0, c1, c2, c3, c4, c5 = var("c0 c1 c2 c3 c4 c5")
s = solve([c0*xs[i]^2+c1*ys[i]^2+c2*xs[i]*ys[i]+c3*xs[i]+c4*ys[i]+c5 == solns[i] for i in range(9)], [c0, c1, c2, c3, c4, c5])[0]

print(s)
c = [x.right() for x in s]
print(c)

x, y = var("x y")
f = c[0]*x^2+c[1]*y^2+c[2]*x*y+c[3]*x+c[4]*y+c[5]
print(bytes.fromhex(hex(int(f(x=a, y=b)) ^^ flag)[2:]))