# understand JavaScript Code # var arr = [22,12,3,43,56,47,4]; # arr.sort(); # console.log(arr);//[12, 22, 3, 4, 43, 47, 56] # console.log(arr.slice(0));//[12, 22, 3, 4, 43, 47, 56] u=128 defaLSSb(a,b): returnstr(a)<str(b) for i0 in xrange(0x00,u): for i1 in xrange(0x00,u): if aLSSb(i0,i1) and i0+i1 == 0x23: for i2 in xrange(0x00,u): if aLSSb(i1,i2) and i1+i2==0x33: for i3 in xrange(0x00,u): if aLSSb(i2,i3) and i2+i3==0x23: for i4 in xrange(0x00,u): if aLSSb(i3,i4) and i3+i4==0x33: r=[i0,i1,i2,i3,i4] print r data_send=' '.join((map(str,r)))
#[15, 20, 31, 4, 47]
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('47.75.4.252', 23333)) s.send(data_send) print"send: ", data_send print"wait for a while here..........." buffer = [] whileTrue: d = s.recv(1024) if d: buffer.append(d) else: break data = ''.join(buffer) print"rcev: ",data s.close() # *ctf{web_chal_made_by_binary_players_lol}
import random,sys import socketserver import binascii import os import hmac,hashlib from hashlib import sha256 from Crypto.Util.number import isPrime import string from subprocess import run, PIPE, TimeoutExpired from flag import FLAG
defdo_factor(num): try: res = run(cmd, stdout=PIPE, input=('factor(%d)'%num).encode(), timeout=timelimit) except TimeoutExpired: returnFalse tmp = res.stdout.decode() tmp = tmp[tmp.find('***factors found***\n\n')+21:].split('\n') for line in tmp: pos = line.find(' = ') if pos == -1: break factor = int(line[pos+3:]) if line[0] == 'P'andnot isPrime(factor): returnTrue returnFalse
classTask(socketserver.BaseRequestHandler): defproof_of_work(self): proof = ''.join([random.choice(string.ascii_letters+string.digits) for _ inrange(20)]) print(proof) digest = sha256(proof.encode('ascii')).hexdigest() self.request.send(str.encode("sha256(XXXX+%s) == %s\n" % (proof[4:],digest))) self.request.send(str.encode('Give me XXXX:')) x = self.request.recv(10).decode() x = x.strip() wtfpy3 = x+proof[4:] iflen(x) != 4or sha256(wtfpy3.encode('ascii')).hexdigest() != digest: returnFalse returnTrue
defhandle(self): ifnot self.proof_of_work(): return do_init() self.request.sendall(str.encode("No bruteforce required. Do not DOS plz >_<\n")) self.request.sendall(str.encode("The number to factorize: ")) x = self.request.recv(1024) try: x = int(x, 16) except: return if do_factor(x): self.request.sendall(str.encode("What happened? Anyway your flag here: %s\n" % FLAG)) else: self.request.sendall(str.encode("Bye\n"))
import socket import re import string import itertools import hashlib defcrack_sha256(data_part,hash): for i in itertools.product(string.ascii_letters+string.digits,repeat=4): if hashlib.sha256(''.join(i)+data_part).hexdigest()==hash: return''.join(i).strip()
defget(s): buffer = [] try: whileTrue: d = s.recv(10) if d: buffer.append(d) except Exception as e: data = ''.join(buffer) return data
When yafu delete factors, it fails to update the factor type correctly. So it’s possible to fool yafu if you use a smooth number which consists of many small primes. Follow the link in solve.py for more details.
I expect someone would find it when feeding some special cases (like the smooth number as mentioned above) towards yafu. But maybe most players instead focused on the prime test. I released a hint (yafu can be wrong) but seems (as xdd suggested) they just turned to prime test inside yafu lol.