首先参考官网 http://s2e.epfl.ch/
然后主要参考了这篇博客 http://blog.csdn.net/jayxujia123/article/details/34126151
还参考了这篇博客 http://blog.csdn.net/u012905667/article/details/39558899
1、Required Packages
sudo apt-get install build-essential
sudo apt-get install subversion
sudo apt-get install git
sudo apt-get install gettext
sudo apt-get install liblua5.1-0-dev
sudo apt-get install libsdl1.2-dev
sudo apt-get install libsigc++-2.0-dev
sudo apt-get install binutils-dev
sudo apt-get install python-docutils
sudo apt-get install python-pygments
sudo apt-get install nasm
sudo apt-get install libiberty-dev //这个安装不上去,没有关系
sudo apt-get install libc6-dev-i386
sudo apt-get build-dep llvm-3.3
<pre>sudo apt-get build-dep qemu
2、Checking out S2E
mkdir S2EDIR
cd S2EDIR
git clone https://github.com/dslab-epfl/s2e.git
3、Building S2E
mkdir build
cd build
make -f ../s2e/Makefile
4、Preparing a Linux VM Image
./qemu-release/qemu-img create -f raw s2e_disk.raw 2G
wget http://cdimage.debian.org/debian-cd/7.7.0/i386/iso-cd/debian-7.7.0-i386-CD-1.iso
./qemu-release/qemu-system-i386 s2e_disk.raw -m 1024 -cdrom debian-7.7.0-i386-CD-1.iso
//客户端的源过时了,需要添加至少一个常规的仓库
deb http://ftp.debian.org/debian/ wheezy main contrib non-free
//然后执行
apt-get update
apt-get install build-essential
5、然后配置config.lua文件,为了以后可以使用s2eget工具
s2e = {
kleeArgs = {
-- Run each state for at least 30 second before
-- switching to the other:
"--use-batching-search=true", "--batch-time=30.0"
}
}
plugins = {
-- Enable a plugin that handles S2E custom opcode
"BaseInstructions" ,
"HostFiles"
}
pluginsConfig = {}
pluginsConfig.HostFiles = {
baseDirs = {"/home/lifeng/software/S2EDIR/doc"}
}
6、然后将s2e文件夹tar压缩上传到客户机,通过scp命令
7、然后在客户机中编译s2eget命令
8.可以扩展为.s2e格式了
cp s2e_disk.raw s2e_disk.raw.s2e
s2e的镜像格式和raw完全一样的,所以只需要单纯的copy就好了,后面所需要使用的镜像都是.raw.s2e
下面解释一下S2E虚拟机镜像格式
已经存在的镜像格式不适合多路径执行,因为它们常常在读操作中改变内部的记录结构。而且,它们可能把这些改变写到磁盘文件中,引起虚拟机镜像破坏。QCOW2是一个例子
S2E镜像格式,不像其他格式,是多路径的,当在S2E模式下,写对每个状态是局部的不会约束其他状态。而且,写不会将状态传播到镜像中,这个允许在多个S2E实例中共享一块磁盘镜像或者快照
S2E镜像格式在分开的文件中存储快照,以快照的名字为后缀。比如,如果镜像叫做“my_image.raw.s2e”,快照名字是ready(ctrl+alt+2,savevm ready ,quit),则在当前目录下会生成my_image.raw.s2e.ready的镜像
虚拟机镜像的指导
当运行在S2E模式,镜像必须是S2E格式.S2E不支持其他镜像格式
VM镜像的相关需求和建议
在vanilla QEMU中安装OS。这是最快的方式。一般来说,所有的安装和组建工作都应该在vanilla QEMU中进行。
始终备份一个最新的OS。建议在进行每一次分析工作时都从一个新的OS备份开始。例如,如果使用一个镜像已经用来测试过设备驱动了,不要再用它来分析电子表格组件。一个镜像只进行一次分析。这样会更加利于管理而且更容易产生结果
当S2E格式的镜像建立起来即将用于在符号执行模式下运行时,生成一个快照,可以在S2E-enabled QEMU中运行它。这个步骤不是必须的,但是这会大大地缩短启动时间,因为在S2E中启动一个镜像会花费很长时间。
建议在guest OS中使用128MiB的RAM(或者更少)。S2E并不会被内存的大小所限制,而你的物理机器会
禁用桌面主题和一切图形化效果影响以减少资源消耗。
禁用屏幕保护程序。
禁用一切不必要的程序(如文件共享,打印,无线网络配置,防火墙等)来减少内存消耗并提高速度。
避免使用QEMU virtio网络接口。在这个版本的 QEMU中,它被打包到了S2E,可以有随机崩溃。
s2e中有2中模式,DBT模式和S2E模式
在DBT(dynamic binary translation)模式下,qemu是正常使用的,可以上网,主要是对你的客户机系统进行初始化,配置。
<pre name="code" class="cpp">./qemu-release/i386-softmmu/qemu-system-i386 s2e_disk.raw
./qemu-release/i386-softmmu/qemu-system-i386 s2e_disk.raw.s2e //在s2e里的所有操作都不将保存
配置完后,为了保存快照可以在s2e模式下使用,重新启动,这也是S2E **disabled**模式,这种模式可以通过在guest端使用Ctrl + Alt + 2 然后输入'savevm 1'来保存快照(快照名为1)
./qemu-release/i386-softmmu/qemu-system-i386 s2e_disk.raw.s2e -net none
ctrl + alt + 2
savevm 1
quit
然后在S2E模式下启动虚拟机(是 S2E ENABLED模式,这种模式不能保存快照。)
./qemu-release/i386-s2e-softmmu/qemu-system-i386 s2e_disk.raw.s2e -net none -loadvm 1 -s2econfig-file config.lua -s2e-verbose
以上两种模式的区别在于一个是使用i386-softmmu下的文件,一个是使用i386-s2e-softmmu下的文件,注意一点,
i386-softmmu下的qemu-system-i386这个没有-s2e-config-file和-s2e-verbose这个参数,千万不要弄错了。