L33t M4th
Math problems... but in words instead of numbers... and with l33t sp34k...
I used the word2number
library to convert the words to numbers, a dictionary to map the l33t speak, and a bunch of if-else statements for the operators. Then, the result is calculated using eval()
.
from pwn import *
from word2number import w2n
conn = remote('chals3.umdctf.io', 6003)
mapping = {
'1': 'i',
'3': 'e',
'0': 'o',
'7': 't',
'5': 's',
'4': 'a',
'$': 's',
}
conn.recv()
conn.send('\n')
done = False
received = ""
while not done:
data = conn.recvuntil('What is RESULT').decode()
# print(data)
variables = []
for line in data.split('\n')[1:-2]:
line = line.split('=')[1][1:]
line = ''.join([mapping[char] if char in mapping else char for char in line])
words = line.split()
# print(words)
to_eval = ''
number = ''
for word in words:
# print(number)
if word == 'hundreed':
word = 'hundred'
if word == 'fourty':
word = 'forty'
if word == 'or':
to_eval += str(w2n.word_to_num(number))
to_eval += '|'
number = ''
elif word == 'and':
to_eval += str(w2n.word_to_num(number))
to_eval += '&'
number = ''
elif word == 'times':
to_eval += str(w2n.word_to_num(number))
to_eval += '*'
number = ''
elif word == 'divided':
to_eval += str(w2n.word_to_num(number))
to_eval += '//'
number = ''
elif word == 'Pius' or word == 'plus':
to_eval += str(w2n.word_to_num(number))
to_eval += '+'
number = ''
elif word == 'MiNus' or word == 'minus':
to_eval += str(w2n.word_to_num(number))
to_eval += '-'
number = ''
elif word == 'mod':
to_eval += str(w2n.word_to_num(number))
to_eval += '%'
number = ''
else:
number += word + ' '
to_eval += str(w2n.word_to_num(number))
# print(to_eval)
variables.append(eval(to_eval))
# print(variables)
result_line = data.split('\n')[-2]
line = result_line.split('=')[1][1:]
line = ''.join([mapping[char] if char in mapping else char for char in line])
words = line.split()
# print(words)
curr_var = 0
to_eval = ''
for word in words:
if 'var' in word:
to_eval += str(variables[curr_var])
curr_var += 1
else:
if word == 'or':
to_eval += '|'
elif word == 'and':
to_eval += '&'
elif word == 'times':
to_eval += '*'
elif word == 'divided':
to_eval += '//'
elif word == 'Pius' or word == 'plus':
to_eval += '+'
elif word == 'MiNus' or word == 'minus':
to_eval += '-'
elif word == 'mod':
to_eval += '%'
# print(to_eval)
result = eval(to_eval)
# print(result)
conn.send(str(result))
received = conn.recvuntil('more equations to go!\n').decode()
print(received)
if '0 more equations' in received:
done = True
print(conn.recv())
conn.close()
Last updated