def break_ecb(oracle): bs = blocksize(oracle) l = len(oracle()) string_length = len_string(oracle) plaintext = b'' prefix = (l + bs - 1) * b'A' while len(plaintext) <= string_length: oracle_prefix = oracle(prefix) for i in range(127): test = prefix + plaintext + bytes([i]) if oracle(test)[l:l + bs] == oracle_prefix[l:l + bs]: #if i < 10: # hack to break if non- # return plaintext # printable padding found prefix = prefix[1:] plaintext += bytes([i]) #print(chr(i), end = "", flush = True) break return de_pkcs7(plaintext) if __name__ == "__main__": if not detect_ecb(oracle(64 * b'A')): print("Not ECB") raise SystemExit print(break_ecb(oracle).decode())
bs = blocksize(oracle) for i in range(1, bs + 1): if l < len(oracle(i * b'A')): return l - i - len_prefix(oracle) def break_ecb(oracle): bs = blocksize(oracle) l = len(oracle()) string_length = len_string(oracle) prefix_length = len_prefix(oracle) plaintext = b'' uc = (l + bs - len_prefix(oracle) - 1) * b'A' while len(plaintext) <= string_length: oracle_input = oracle(uc) for i in range(127): test = uc + plaintext + bytes([i]) if oracle(test)[l:l + bs] == oracle_input[l:l + bs]: uc = uc[1:] plaintext += bytes([i]) #print(chr(i), end = "", flush = True) break return de_pkcs7(plaintext) if __name__ == "__main__": assert detect_ecb(oracle(48 * b'A')), "Not ECB" print(break_ecb(oracle).decode())
def main() -> None: if not detect_ecb(oracle(64 * b"A")): print("Not ECB") raise SystemExit print(break_ecb(oracle).decode())
def main() -> None: assert detect_ecb(oracle(48 * b"A")), "Not ECB" print(break_ecb(oracle).decode())