[buuctf.reverse] 63 equation

附件是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; 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值