首页
社区
课程
招聘
[原创]使用Scylla进行Dump时遇到的Bug分析、利用与修复
发表于: 2025-8-18 00:09 833

[原创]使用Scylla进行Dump时遇到的Bug分析、利用与修复

2025-8-18 00:09
833

前言



Scylla是一个常用的内存转储(Dump)和导入表修复工具,你可以在很多脱壳教程中见到它,它是开源的(2acK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6z5N6q4q4#2k6i4u0&6i4K6u0r3f1$3y4&6L8r3I4S2)。


分析



下图中的代码展示了Scylla进行内存转储的主要过程。

阅读源码可以了解,在进行Dump时,Scylla假定每个区段的正常大小为对应的 Virtual Size。
操作系统加载PE文件时,若 Virtual Size 大于 Raw Size,会用0填充内存中的剩余空间。
Virtual Size 也可以小于 Raw Size,下图是我用msvc编译出的一个例子。由于内存对齐,.text区段加载到内存中的大小为0x13000,这使得可以容纳略大一些的数据(0x12600)。

在未加壳情况下,Scylla Dump一般不会出现问题,即使 Virtual Size 小于 Raw Size,Scylla也只是读取内存中的数据并覆盖掉前面部分的原始数据。但是当程序被加壳压缩时,Raw Size和Raw Data被清空,Scylla的Dump在特定情况下就会发生数据丢失问题。



利用



可以构造特殊的区段结构进行反Dump。以下是手动修改程序的步骤,模拟被加壳时的状态。
1、新增一个空的可执行区段,大小比.text略大一些。
2、备份.text区段的数据至新区段中,清空.text区段的数据,清空Raw size,修改.text区段属性可写。
3、在新区段开头使用汇编恢复被清空的.text数据,修改入口点。
4、修改.text区段的Vitual Size至一个比原始值略小的特殊值(0x12001),.text区段加载到内存中的大小仍为0x13000。

被加壳后的程序运行并不会发生问题。让被加壳的程序运行到OEP,再使用Scylla Dump,可以发现Dump后的程序丢失了末尾的代码,Dump后的程序无法正常运行。


修复


以下是我的修复,认定的正常大小不应为Virtual Size,修改为内存对齐后的大小。附件为修复后的Scylla。




















[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

最后于 2025-8-18 00:36 被寞叶_编辑 ,原因:
上传的附件:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回