RetroWrite是X64和AARCH64的静态二进制重写器。它没有启发式方法,不会引入开销,而是使用符号化技术(也称为可重装组件)将仪器插入二进制文件而无需源代码。
请注意,X64版本和ARM64版本使用不同的重写算法并支持不同的功能。
有关技术详细信息,您可以在X64版本和ARM64版本的本文中阅读论文(在IEEE S&P'20中)。
Kretrowrite是X64版本的变体,该版本支持Linux内核模块的重写。
Retrowrite在Python3(3.6)中实现。这取决于pyelftools和capstone 。要安装依赖项,请运行:
pip install - r requirements . txt不建议您从发行版的包装管理人员那里安装依赖项,因为它们可能已经过时了。
| Retrowrite-X64 | Retrowrite-Aarch64 | |
|---|---|---|
| 剥离的二进制物 | (WIP) | ✅ |
| 非pie二进制 | ✅ | |
| 非标准编译器 | ✅ | |
| 零开销 | ✅ | ✅ |
| 内核模块支持 | ✅ | |
| AFL覆盖仪器 | ✅ | ✅ |
| Asan仪器 | ✅ | ✅ |
| C ++支持 | (WIP) | (WIP) |
(retro) $ retrowrite --help
usage: retrowrite [-h] [-a] [-A] [-m MODULE] [-k] [--kcov] [-c] [--ignore-no-pie] [--ignore-stripped] [-v] bin outfile
positional arguments:
bin Input binary to load
outfile Symbolized ASM output
optional arguments:
-h, --help show this help message and exit
-a, --assemble Assemble instrumented assembly file into instrumented binary
-A, --asan Add binary address sanitizer instrumentation
-m MODULE, --module MODULE
Use specified instrumentation pass/module in rwtools directory
-k, --kernel Instrument a kernel module
--kcov Instrument the kernel module with kcov
-c, --cache Save/load register analysis cache (only used with --asan)
--ignore-no-pie Ignore position-independent-executable check (use with caution)
--ignore-stripped Ignore stripped executable check (use with caution)
-v, --verbose Verbose output选择您想使用retrowrite -m <pass>应用的仪器通行证,您可以在文件夹rwtools_x64和rwtools_arm64中找到可用的仪器通行证。
X64的可用仪器通行证: - 地址齐态 - AFL覆盖信息
可用的仪器通过AARCH64: - addressSanitizer- AFL覆盖信息 + forkserver-函数条目上的粗粒粒度控制流程完整性
retrowrite --asan </path/to/binary/> </path/to/output/binary>
注意:如果在X64上,请确保二进制是独立于位置并且不会剥离的。可以使用file命令(输出应该说ELF shared object )检查一下。
例如,创建/bin/ls的仪器版本:
retrowrite --asan /bin/ls ls-basan-instrumented.s
这将生成一个汇编( .s )文件。要将大会重新编译回到二进制中,这取决于架构:
可以使用任何编译器将生成的组件组装和链接,例如:
gcc ls-basan-instrumented.s -lasan -o ls-basan-instrumented
调试如果您获得undefined reference to `__asan_init_v4' ,则在汇编文件中替换“ asan_init” Asan_init_v4”,以下命令可以帮助您做到这一点: sed -i 's/asan_init_v4/asan_init/g' ls-basan-instrumented.s
在AARCH64上,我们还依靠标准编译器组装和链接,但是编译器标志的收集略微涉及,因此我们在主retrowrite机上提供了-a开关为您提供此操作:
retrowrite -a ls-basan-instrumented.s -lasan -o ls-basan-instrumented
要生成AFL启发的二进制文件,请首先生成符号的组件,如上所述。然后,从AFL ++中使用afl-gcc重新编译象征的组件:
$ AFL_AS_FORCE_INSTRUMENT=1 afl-gcc foo.s -o foo
或afl-clang 。
要使用覆盖范围信息来仪器,请使用retrowrite -m coverage <input file> <output asm>的覆盖范围仪器通过。用retrowrite -a <output asm> <new binary>重新组装二进制文件。
现在可以将二进制构成:
afl-fuzz -i < seed folder > -o < out folder > < new binary > Retrowrite还试图添加仪器以充当AFL的叉车。如果这会导致问题,您可以使用export AFL_NO_FORKSERVER=1来禁用此行为
要生成可以通过手动修改或通过现有工具进行后处理的象征组件,只是不要指定任何仪器通过:
retrowrite </path/to/binary> <path/to/output/asm/files>
输出ASM文件可以手工或其他工具自由编辑。修饰后,ASM文件可以如上所述组装到工作二进制文件中。
尽管Retrowrite与其他工具可互操作,但我们强烈鼓励研究人员使用Retrowrite API来满足其二元仪器 /修改需求!这节省了必须加载和解析二进制文件或装配文件的额外努力。
运行setup.sh :
./setup.sh kernel激活VirtualEnv(来自存储库的根):
source retro/bin/activate(奖励)完成Retrowrite完成后退出Virtualenv:
deactivateretrowrite --asan --kernel </path/to/module.ko> </path/to/output/module_asan.ko>retrowrite </path/to/module.ko> <path/to/output/asm/files> 有关模糊活动,请参阅模糊/文件夹。
通常, librw/包含用于加载,拆卸和象征二进制的代码,并构成了所有转换的核心。单个转换通过该重写框架上的基础上建立的,例如我们的仅二进制地址消毒剂(Basan)作为rwtools/中的单个工具包含。
从k开头的文件和文件夹与内核卷盘版本链接。
在演示/文件夹中,您将找到用于用户空间和内核recrowrite的示例(分别为demos/user_demo和demos/kernel_demo)。
以下出版物涵盖了Retrowrite项目的不同部分:
Retrowrite:用于模糊和消毒的静态仪器COTS二进制文件Sushant Dinesh,Nathan Burow,Dongyan Xu和Mathias Payer。在奥克兰20:IEEE国际安全与隐私研讨会,2020年
没有消息来源,没有问题!高速二进制模糊Matteo Rizzo和Mathias付款人。在36c3'19:混乱传播大会,2019年
麻省理工学院许可证
版权(c)2019年六角形集团,sushant dinesh [email protected],luca di bartolomeo [email protected],antony vennard [email protected],matteo rizzo rizzo [email protected]@gmail.com
特此免费授予获得此软件副本和相关文档文件副本(“软件”)的任何人,以无限制处理该软件,包括无限制的使用权,复制,复制,修改,合并,合并,发布,分发,分发,分发,订婚,和/或允许软件的副本,并允许对以下条件提供以下条件,以下是以下条件。
上述版权通知和此许可通知应包含在软件的所有副本或大量部分中。
该软件是“原样”提供的,没有任何形式的明示或暗示保证,包括但不限于适销性,特定目的的适用性和非侵权的保证。在任何情况下,作者或版权持有人都不应对任何索赔,损害赔偿或其他责任责任,无论是在合同,侵权的诉讼中还是其他责任,是由软件,使用或与软件中的使用或其他交易有关的。