Skip to content

Instantly share code, notes, and snippets.

@gnomus
Created August 18, 2014 04:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gnomus/4a119910a616b703620a to your computer and use it in GitHub Desktop.
Save gnomus/4a119910a616b703620a to your computer and use it in GitHub Desktop.
24
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