CRYPTOHACK challenge Encoding Challenge个人writeup
目录
一、解题思路分析
二、关键步骤实现
1.建立连接与通信
2.多编码类型解码器
三、自动化挑战流程
1.循环处理数据
2.实时解码与反馈
四、运行与结果
1.依赖安装
2.执行脚本
3.输出示例
一、解题思路分析
该挑战要求连续解码100次由服务器随机生成的加密数据,加密方式可能为base64、hex、rot13、bigint或utf-8五种之一。核心在于动态识别加密类型并执行对应的解码操作。
二、关键步骤实现
1.建立连接与通信
使用pwntools库建立与服务器的socket连接,通过JSON格式收发数据。
json_recv()和json_send()函数处理数据的序列化与反序列化。
from pwn import * import json r = remote("socket.cryptohack.org", 13377) def json_recv(): line = r.recvline() return json.loads(line.decode()) def json_send(hsh): request = json.dumps(hsh).encode() r.sendline(request)2.多编码类型解码器
根据type字段动态选择解码方式:
base64: 使用base64.b64decode
hex: 通过bytes.fromhex转换
rot13: 调用codecs.decode的ROT13解码
bigint: 处理十六进制字符串并转换为字节
utf-8: 将ASCII码列表拼接为字符串
def decode_payload(enc_type, encoded): if enc_type == "base64": return base64.b64decode(encoded).decode() elif enc_type == "hex": return bytes.fromhex(encoded).decode() elif enc_type == "rot13": return codecs.decode(encoded, "rot_13") elif enc_type == "bigint": num = int(encoded, 16) return long_to_bytes(num).decode() elif enc_type == "utf-8": return ''.join(chr(c) for c in encoded)三、自动化挑战流程
1.循环处理数据
持续接收服务器数据,检测是否包含flag或error字段以终止循环。
2.实时解码与反馈
提取type和encoded字段,调用decode_payload()解码后返回结果。
while True: received = json_recv() if "flag" in received: print("\n[+] Flag:", received["flag"]) break if "error" in received: print("\n[-] Error:", received["error"]) break enc_type = received["type"] enc_val = received["encoded"] decoded = decode_payload(enc_type, enc_val) json_send({"decoded": decoded})四、运行与结果
1.依赖安装
执行以下命令安装所需库:
pip install pwntools pycryptodome2.执行脚本
保存代码为solve.py并运行:
python3 solve.py3.输出示例
成功后将显示类似结果:
[+] Flag: crypto{3nc0d3_d3c0d3_3nc0d3}