#!/usr/bin/env python3 """Grenade 靶场 /var/backups/creds.b92 的 base92 解码器(零依赖)。 用法: python3 decode_creds_b92.py creds.b92 cat creds.b92 | python3 decode_creds_b92.py """ import sys ALPHABET = ( "!" + "".join(chr(ord("#") + i) for i in range(61)) + "".join(chr(ord("a") + i) for i in range(29)) ) VALUES = {char: index for index, char in enumerate(ALPHABET)} def base92_decode(data: bytes) -> bytes: if data == b"~": return b"" if len(data) == 1: raise ValueError("invalid base92 string (single character)") bit_buffer = 0 bit_count = 0 result = bytearray() index = 0 while index < len(data) - 1: chunk = VALUES[chr(data[index])] * 91 + VALUES[chr(data[index + 1])] if chunk >= 8192: raise ValueError("invalid base92 chunk") bit_buffer = (bit_buffer << 13) | chunk bit_count += 13 while bit_count >= 8: result.append(bit_buffer >> (bit_count - 8)) bit_buffer &= (1 << (bit_count - 8)) - 1 bit_count -= 8 index += 2 if index < len(data): bit_buffer = (bit_buffer << 6) | VALUES[chr(data[index])] bit_count += 6 while bit_count >= 8: result.append(bit_buffer >> (bit_count - 8)) bit_buffer &= (1 << (bit_count - 8)) - 1 bit_count -= 8 return bytes(result) def main() -> None: if len(sys.argv) > 1: with open(sys.argv[1], "rb") as handle: raw = handle.read() else: raw = sys.stdin.buffer.read() print(base92_decode(raw.strip()).decode("utf-8")) if __name__ == "__main__": main()