目录

  1. 1. 前言
  2. 2. gc模块
    1. 2.1. 主要函数

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

Python利用gc沙箱逃逸

2024/4/30 Web 沙箱逃逸 python
  |     |   总文章阅读量:

前言

参考:https://xz.aliyun.com/t/12647

思路来源于 writeup by fab1ano – github

gc模块

gc 模块主要的功能是提供一个接口供开发者直接与 Python 的垃圾回收机制进行交互

和php的gc一样,也是“garbage collector”,使用了引用计数作为其主要的内存管理机制,同时也引入了循环垃圾回收器来检测并收集循环引用的对象

gc模块提供了一些函数,让你可以直接控制这个循环垃圾回收器

主要函数

  1. gc.collect(generation=2):这个函数会立即触发一次垃圾回收。你可以通过 generation 参数指定要收集的代数。Python 的垃圾回收器是分代的,新创建的对象在第一代,经历过一次垃圾回收后仍然存活的对象会被移到下一代
  2. gc.get_objects():这个函数会返回当前被管理的所有对象的列表
  3. gc.get_referrers(*objs):这个函数会返回指向 objs 中任何一个对象的对象列表

简单整个demo测试一下:

import gc

for obj in gc.get_objects():
    #print(obj)
    if '__name__' in dir(obj):
        #print(obj.__name__)
        if 'os' == obj.__name__:
            print('Found module os')
            mod_os = obj
            print(mod_os)
            mod_os.system("calc")

image-20240430195554690

可以看到这样就能拿到os模块并命令执行了

注:在 3.11 版本和 python 3.8.10 版本中测试发现会触发 gc.get_objects hook 导致无法成功.