前言
参考:https://xz.aliyun.com/t/12647
思路来源于 writeup by fab1ano – github
gc模块
gc
模块主要的功能是提供一个接口供开发者直接与 Python 的垃圾回收机制进行交互
和php的gc一样,也是“garbage collector”,使用了引用计数作为其主要的内存管理机制,同时也引入了循环垃圾回收器来检测并收集循环引用的对象
而gc
模块提供了一些函数,让你可以直接控制这个循环垃圾回收器
主要函数
gc.collect(generation=2)
:这个函数会立即触发一次垃圾回收。你可以通过generation
参数指定要收集的代数。Python 的垃圾回收器是分代的,新创建的对象在第一代,经历过一次垃圾回收后仍然存活的对象会被移到下一代gc.get_objects()
:这个函数会返回当前被管理的所有对象的列表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")
可以看到这样就能拿到os模块并命令执行了
注:在 3.11 版本和 python 3.8.10 版本中测试发现会触发 gc.get_objects hook 导致无法成功.