附件是js的,js不用反编译但并不比汇编更好懂。
仔细看就是用brainfuck写的程序,大意是
(l[8]-l[3]+... == 8) && ( ...) ...
写了一小段处理一下,然后用numpy.linalg求解行列式。
from js2py import EvalJs
js = EvalJs()
a = open('a.txt', 'r').readlines('&&')
v = "<script lang=javascript>"
name_v = []
s = ''
pp = []
pq = []
for i in a:
p = [0]*42
b = i.strip().split('==')
c = '+'+b[0]
j = 0
while j<len(c):
sig = c[j]
t1=1
j +=3
t2=j
while t1 != 0:
if c[j] == '[':
t1+=1
elif c[j] == ']':
t1-=1
j+=1
#print('r = '+c[t2:j-1])
js.execute('r = '+c[t2:j-1])
idx = int(js.r)
if sig == '+':
p[idx] = 1
elif sig == '-':
p[idx] = -1
pp.append(p)
#print('t = '+b[1][2:-1])
js.execute('t = '+b[1])
pq.append(int(js.t))
print(pp)
print(pq)
import numpy as np
an = np.array(pp)
bn = np.array(pq)
x = np.linalg.solve(an,bn)
print(x)
print(bytes([round(i) for i in x]))
#flag{A_l0ng_10NG_eqU4Ti0n_1s_E4Sy_W1Th_z3}
完事发现弄得太复杂了,可以直接用js处理比较简单,后边他用的z3求解,不过我认为对一变量多的时候这种行列式基本不用时间,但z3用。
<script>
function deEquation(str) {
for(let i=0;i<=3;++i){
str = str.replace(/l\[(\D*?)](\+l|-l|==)/g, (m, a, b) => 'l[' + eval(a) + ']' + b);
}
str = str.replace(/==(\D*?)&&/g, (m, a) => '==' + eval(a) + '&&');
return str;
}