Overview
プログラムは Base32 文字列 b32 と Base64 文字列 b64 を受け取り、次を満たすときにExpected :)を表示する。
- パディングが含まれない
- デコード結果が一致する
- len(b32) >= len(b64) ならフラグが出る
よってパディング無しで、デコード結果は一致させつつ、len(b32) より len(b64) を大きくすることがゴールになる。
Solution
おそらく、最も簡単なのは、両方のデコード結果を空バイト列 b'' に揃える方法である。 今回着目したのは「!」を入力した際の挙動である。
! は Base64 の有効文字ではないため、validate=False の挙動によりすべて無視される。 結果として空文字列を Base64 デコードしたのと同じ扱いになり、これも b'' になる。
したがって
b32 = ""(空文字)
b64 = "!!!!"(=を含まない任意の文字列)
とすると、
- = を含まないのでパディング禁止条件は満たす。
- b32decode("") == b64decode("!!!!") == b'' なので、デコード結果一致の条件も満たす。
- 長さは len(b32) = 0,len(b64) = 4 であり、len(b32) < len(b64) が成立する。
よって条件をすべて満たすため、フラグが表示される。
Solver
from ptrlib import Socket
HOST = "34.170.146.252"
PORT = 60350
p = Socket(HOST, PORT)
p.recvuntil("Base32:")
p.sendline("")
p.recvuntil("Base64:")
p.sendline("!!!!")
p.interactive()