用python编写的kvm客户机
pykvm的Python项目详细描述
pykvm一个小型kvm客户机,演示如何使用python中的基于内核的虚拟机(kvm)接口。这个 客户端首先用少量内存初始化一个barebones虚拟机,然后加载并运行一个原始二进制文件。从那以后 没有来宾操作系统,没有设备,也没有可用的I/O,二进制文件只能访问CPU寄存器和内存。
此客户端与S2E提供的KVM extensions for symbolic execution兼容。在 换句话说,可以用pykvm象征性地执行程序。
使用本机kvm运行
首先,构建示例二进制文件。这个二进制文件在地址0x1000写入4KB数据,然后停止CPU。
git clone https://github.com/s2e/pykvm
cd pykvm
make -C sample
然后,在pykvm中运行编译后的sample.bin二进制文件。确保/dev/kvm可访问。
python -m pykvm.kvm sample/sample.bin
输出将显示执行二进制文件之前和之后内存的状态。
符号执行
我们现在将本地kvm替换为实现符号执行的版本。
首先,您需要构建s2e。有关详细信息,请参阅s2edocumentation。在 下面的所有命令,S2EDIR变量指向使用s2e-env设置的s2e环境的根。
其次,使用s2e支持重新编译样本二进制文件。这对于将符号值写入内存是必要的。在 目前,pykvm无法直接将符号数据写入内存,因此必须从运行的二进制文件中完成 相反。
make -C sample clean make -C sample EXTRA_CFLAGS="-DUSE_S2E -I$S2EDIR/source/s2e/guest/common/include"exportS2E_CONFIG=sample/s2e-config.lua # libs2e.so uses LD_PRELOAD to intercept all calls to /dev/kvm in order to emulate # native KVM while at the same time providing symbolic execution capabilities. LD_PRELOAD=$S2EDIR/build/s2e/libs2e-release/x86_64-s2e-softmmu/libs2e.so python -m pykvm.kvm sample/sample.bin
当所有路径完成时,libs2e会自动终止python进程。你可以检查 s2e-last/debug.txt查看符号执行输出。您将发现几个与 示例二进制文件的执行路径。有关 预期结果。
项目
下面是一些有趣的东西,您可以尝试在pykvm之上构建。
在gdb中与libs2e一起运行pykvm。gdb.ini脚本包含s2e所需的配置。请不要 忘了根据你的系统调整路径。
gdb --init-command gdb.ini --args python -m pykvm.kvm sample/sample.bin
编写一个实现s2e_make_symbolicsyscall的小库,以便二进制文件可以获取符号数据 更容易的。你可以把这个库看作一个操作系统,或者更好的是bios。
扩展pykvm以将实际的elf/pe文件加载到内存中。当然,它们不会有任何导入或操作系统依赖项。