用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之上构建。

  1. 在gdb中与libs2e一起运行pykvm。gdb.ini脚本包含s2e所需的配置。请不要 忘了根据你的系统调整路径。

    gdb --init-command gdb.ini --args python -m pykvm.kvm sample/sample.bin
    
  2. 编写一个实现s2e_make_symbolicsyscall的小库,以便二进制文件可以获取符号数据 更容易的。你可以把这个库看作一个操作系统,或者更好的是bios。

  3. 扩展pykvm以将实际的elf/pe文件加载到内存中。当然,它们不会有任何导入或操作系统依赖项。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
多线程重新构造使用线程池和BlockingQueue的I/O密集型Java web服务   java SWT CTabFolder检查CTAB是否存在   java如何防止具体类的实例化?   java如何将子域定向到正确的JBoss应用程序?   java Android外部文件出现不一致   java FileSystemNotFoundException:未安装提供程序“jndi”   显示jframe上的java隐藏单选按钮   java CXF客户端TCP连接在每个请求之间关闭   Hadoop查询、日期、循环、BASH或Java   java从长类型到十进制类型对象的转换类型错误   java为什么不在用户消息中提供用户提供的数据?有可能的威胁/攻击吗?   使用作用域存储MediaStore的应用程序中的java共享意图问题   java我可以通过将成员指针传递给方法并在方法中分配来初始化它吗?   java如何在一个包含正负值的数组中找到最大的负值?   java有比较二叉树路径的简单方法吗?   java Swagger(ui)不显示操作   java KairosDB缺失值的线性插值   用于此特定求和的java循环