Created
August 18, 2014 04:14
-
-
Save gnomus/4a119910a616b703620a to your computer and use it in GitHub Desktop.
24
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import operator | |
from sys import argv, exit | |
import signal | |
import time | |
class TimeoutException(Exception): | |
pass | |
class Timeout(): | |
"""Timeout class using ALARM signal.""" | |
def __init__(self, sec): | |
self.sec = sec | |
def __enter__(self): | |
signal.signal(signal.SIGALRM, self.raise_timeout) | |
signal.alarm(self.sec) | |
def __exit__(self, *args): | |
signal.alarm(0) # disable alarm | |
def raise_timeout(self, *args): | |
raise TimeoutException() | |
ARITHMETIC_OPERATORS = { | |
'+': operator.add, '-': operator.sub, | |
'*': operator.mul, '/': operator.truediv, '%': operator.mod, | |
'**': operator.pow, '//': operator.floordiv, | |
} | |
def postfix(expression, operators=ARITHMETIC_OPERATORS): | |
stack = [] | |
got_some_pot = False; | |
try: | |
with Timeout(1): | |
for val in expression.split(): | |
if val in operators: | |
if not got_some_pot and val == '**': | |
got_some_pot = True | |
elif val == '**': | |
return 0 | |
lastop = val | |
f = operators[val] | |
stack[-2:] = [f(*stack[-2:])] | |
else: | |
stack.append(int(val)) | |
return stack.pop() | |
except TimeoutException: | |
print("Calc Timeout") | |
print(expression) | |
raise TimeoutException() | |
return 0 | |
except: | |
return 0 | |
def getop(o): | |
return ['+','-','*','/','//','**'][o] | |
def infix(rpn,x): | |
e = rpn.split() | |
if x == 0: | |
return '((' + e[0] + e[2] + e[1] + ')' + e[4] + e[3] + ')' + e[6] + e[5] | |
if x == 1: | |
return '(-(' + e[0] + e[2] + e[1] + ')' + e[6] + e[5] + ')' + e[8] + e[7] | |
if x == 2: | |
return '-((' + e[0] + e[2] + e[1] + ')' + e[4] + e[3] + ')' + e[8] + e[7] | |
if x == 3: | |
return '-(-(' + e[0] + e[2] + e[1] + ')' + e[6] + e[5] + ')' + e[10] + e[9] | |
if x == 4: | |
return '(' + e[0] + e[2] + e[1] + ')' + e[6] + '(' + e[3] + e[5] + e[4] + ')' | |
if x == 5: | |
return '-(' + e[0] + e[2] + e[1] + ')' + e[8] + '(' + e[5] + e[7] + e[6] + ')' | |
if x == 6: | |
return '(' + e[0] + e[2] + e[1] + ')' + e[8] + '-(' + e[3] + e[5] + e[4] + ')' | |
if x == 7: | |
return '-(' + e[0] + e[2] + e[1] + ')' + e[10] + '-(' + e[5] + e[7] + e[6] + ')' | |
if x == 8: | |
return e[0] + e[6] + '(' + e[1] + e[5] + '(' + e[2] + e[4] + e[3] + '))' | |
if x == 9: | |
return e[0] + e[8] + '(' + e[1] + e[7] + '-(' + e[2] + e[4] + e[3] + '))' | |
if x == 10: | |
return e[0] + e[8] + '-(' + e[1] + e[5] + '(' + e[2] + e[4] + e[3] + '))' | |
if x == 11: | |
return e[0] + e[10] + '-(' + e[1] + e[7] + '-(' + e[2] + e[4] + e[3] + '))' | |
def buildcalc(c1,c2,c3,c4,op1,op2,op3): | |
try: | |
for nop1 in ['','-']: | |
for nop2 in ['','-']: | |
for nop3 in ['','-']: | |
for nop4 in ['','-']: | |
guess = ['','','','','','','','','','','',''] | |
guess[0] = nop1 + c1 + ' ' + nop2 + c2 + ' ' + getop(op1) + ' ' + nop3 + c3 + ' ' + getop(op2) + ' ' + nop4 + c4 + ' ' + getop(op3) | |
guess[1] = nop1 + c1 + ' ' + nop2 + c2 + ' ' + getop(op1) + ' -1 * ' + nop3 + c3 + ' ' + getop(op2) + ' ' + nop4 + c4 + ' ' + getop(op3) | |
guess[2] = nop1 + c1 + ' ' + nop2 + c2 + ' ' + getop(op1) + ' ' + nop3 + c3 + ' ' + getop(op2) + ' -1 * ' + nop4 + c4 + ' ' + getop(op3) | |
guess[3] = nop1 + c1 + ' ' + nop2 + c2 + ' ' + getop(op1) + ' -1 * ' + nop3 + c3 + ' ' + getop(op2) + ' -1 * ' + nop4 + c4 + ' ' + getop(op3) | |
guess[4] = nop1 + c1 + ' ' + nop2 + c2 + ' ' + getop(op1) + ' ' + nop3 + c3 + ' ' + nop4 + c4 + ' ' + getop(op2) + ' ' + getop(op3) | |
guess[5] = nop1 + c1 + ' ' + nop2 + c2 + ' ' + getop(op1) + ' -1 * ' + nop3 + c3 + ' ' + nop4 + c4 + ' ' + getop(op2) + ' ' + getop(op3) | |
guess[6] = nop1 + c1 + ' ' + nop2 + c2 + ' ' + getop(op1) + ' ' + nop3 + c3 + ' ' + nop4 + c4 + ' ' + getop(op2) + ' -1 * ' + getop(op3) | |
guess[7] = nop1 + c1 + ' ' + nop2 + c2 + ' ' + getop(op1) + ' -1 * ' + nop3 + c3 + ' ' + nop4 + c4 + ' ' + getop(op2) + ' -1 * ' + getop(op3) | |
guess[8] = nop1 + c1 + ' ' + nop2 + c2 + ' ' + nop3 + c3 + ' ' + nop4 + c4 + ' ' + getop(op1) + ' ' + getop(op2) + ' ' + getop(op3) | |
guess[9] = nop1 + c1 + ' ' + nop2 + c2 + ' ' + nop3 + c3 + ' ' + nop4 + c4 + ' ' + getop(op1) + ' -1 * ' + getop(op2) + ' ' + getop(op3) | |
guess[10] = nop1 + c1 + ' ' + nop2 + c2 + ' ' + nop3 + c3 + ' ' + nop4 + c4 + ' ' + getop(op1) + ' ' + getop(op2) + ' -1 * ' + getop(op3) | |
guess[11] = nop1 + c1 + ' ' + nop2 + c2 + ' ' + nop3 + c3 + ' ' + nop4 + c4 + ' ' + getop(op1) + ' -1 * ' + getop(op2) + ' -1 * ' + getop(op3) | |
for g in range(0,12): | |
erg = postfix(guess[g]) | |
if abs(erg - 24) < 1e-15: | |
return infix(guess[g],g) | |
except: | |
print('Timeout') | |
print('{}{}{}{}{}{}{}'.format(c1,c2,c3,c4,op1,op2,op3)) | |
def shufflenum(args,op1,op2,op3): | |
for c1 in range(0,4): | |
for c2 in range(0,4): | |
if c1 != c2: | |
for c3 in range(0,4): | |
if c3 != c1 and c3 != c2: | |
for c4 in range(0,4): | |
if c4 != c1 and c4 != c2 and c4 != c3: | |
sup = buildcalc(str(args[c1]),str(args[c2]),str(args[c3]),str(args[c4]),op1,op2,op3) | |
if sup != None: | |
return sup | |
def selectops(args): | |
for op1 in range(0,6): | |
for op2 in range(0,6): | |
for op3 in range(0,6): | |
sup = shufflenum(args,op1,op2,op3) | |
if sup != None: | |
return sup | |
import telnetlib | |
t=telnetlib.Telnet('210.65.89.59',2424) | |
for q in range(0,24): | |
x = (t.read_until(b'Answer: ')).decode('ASCII') | |
print(x) | |
import re | |
match = re.search('\[(.+)\]',x) | |
vals = (match.group(1)).replace(" ", "").split(",") | |
output = selectops(vals) | |
print(bytes(output,"ASCII")) | |
t.write(bytes(output,'ASCII')) | |
t.write(b'\n') | |
flag = t.read_all() | |
print(flag) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment