用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第三方库


热门话题
java我能知道文件的哪个条目正在被修改吗?   多线程Java并发线程   java抓取包含多个页面的多个字母标签的网站   为什么if语句不排除Java中的另一个if语句?   Java可序列化哈希映射到ByteArray以创建blob   JavaEclipseLombokBuilder添加新建议   java将文件路径数组转换为文件数组,并计算每个文件的大小   在Java8流中添加大小数   Bouncy Castle 1.46之前版本的java兼容性问题   无法在AWS设备场上运行安卓 Java Appium测试   java为什么不使用mavenwarplugin将键与“WEBINF/classes/METAINF/MANIFEST.MF”合并?   java如何在引用子类的成员时调用super()   找不到java TestFx无头MonoclePlatformFactory   java AbstractMethodError onClientSessionEvent和“缺少控制媒体的权限”   正则表达式如何使用JAVA在字符串的大写字母前插入空格?   我的Spring安全项目中的java BCrypt(Spring安全)   java在我的网站上查看小程序更新时遇到问题   java如何使用schedule方法