本文主要是自己在搭建s2e环境中的一个笔记,因为其中很多细节问题需要注意,所以特意记录下来希望对相关的学习者有用。
官方网站:http://s2e.epfl.ch/
官方在线文档地址:https://dslabredmine.epfl.ch/embedded/s2e/index.html
Git项目地址:https://github.com/DonDiego/s2e
GoogleGroups讨论组s2e地址:https://groups.google.com/forum/?hl=zh-CN#!forum/s2e-dev
(非常有用,我在安装的过程中出现的问题主要是从这里面找到答案,当然也有自己发帖子别人回答的,同时也利用这里面一些人的发帖,直接给这些人发邮件问问题,一般还是比较热心的)
大致说一下s2e的安装与编译过程以及后面的一些章节的学习的过程。
前提
1. 系统必须要对,不然就会出各种错误(我之前用的Ubuntu13.04的系统就出问题了,编译s2e出现找不到c++config.h这个文件,不要试图去其他地方找到然后放入s2e调用的文件夹中再编译,这样最后会进入死循环)
2. 不要使用虚拟机,必须使用真机。(虚拟机下各种错误,不解释。)
3. 一定要能让guest端能获取到host端的文件(方法:先在guest中保存s2e源代码文件,然后编译其中的s2eget工具,这样就可以实现从host端获取文件,后面我会具体说明方法)
4. 不要使用从官方网站上下载下来的stable-1.3的源代码,这个编译会出问题,而且docs文档也和从git上下载下来的也有差别,建议以git上的文件为准,我后面的操作均以git clone后得到的s2e项目文件为准。
环境:host(真机系统):Ubuntu 12.04 LTS 64bits 核是3.2.0-23-generic
Guest: debian-7.5.0-i386-CD-1.iso(64bits)
下面具体按照手册上面说的一一来说明
1.Building the S2E Platform
本章首先需要注意一个问题:
make的时候需要用root身份执行,否则会提示无法连接llvm.org(终端无法ping通llvm.org,但是网页可以访问,不知道为什么)
然后这一节按照手册上面说的做,在使用
make -f ../s2e/Makefile
这一条命令时(注意Makefile位置),可以这样修改:
make -f ../s2e/Makefile 2>build_out.txt
这样就可以将warning和error信息输入到文件中以便编译完成后查看
注意编译完后可能会出现问题,比如我的就出现了:
“In file included from /usr/include/dlfcn.h:23:0,
from/home/s2e/S2EDIR/s2e/guest/init_env/init_env.c:39:
/usr/include/features.h:324:26: fatalerror: bits/predefs.h: No such file or directory:324:26: fatal error:bits/predefs.h: No such file or directory
compilation terminated.
compilation terminated.
make[1]: *** [init_env.so] Error 1
make[1]: *** Waiting for unfinishedjobs....
make[1]: *** [s2ecmd] Error 1
make: *** [stamps/guest-tools32-make] Error2”
这样的问题,我表示没有解决,但是好像也不影响后面的使用(我的问题具体可以见git.txt)
编译完成后会形成以下文件夹:
$S2EDIR/build/qemu-release,如果你连qemu-release文件夹都没有表示编译完全失败,必须重新来(可能是你操作系统问题)
2. Preparing VM Images for S2E
本章在安装guest端系统debian时注意以下两点:
1.Debian系统请选择英文的系统。(使用命令dpkg-reconfigurelocales即可)
2.debian的/etc/apt/sources.list源需要更新
(更新源后然后运行:apt-get update再运行apt-get install build-essential)
在完成以下命令后:
$ # Create an empty disk image
$ $S2EDIR/build/qemu-release/qemu-imgcreate -f raw s2e_disk.raw 2G
$ # Download debian install CD
$ wgethttp://cdimage.debian.org/debian-cd/current/i386/iso-cd/debian-6.0.6-i386-businesscard.iso
$ # Run QEMU and install the OS
$$S2EDIR/build/qemu-release/i386-softmmu/qemu-system-i386 s2e_disk.raw -cdromdebian-6.0.2.1-i386-businesscard.iso
> Follow on-screen instructions toinstall Debian Linux inside VM
> Select only "StandardSystem" component to install
$ # When you system is installed andrebooted, run the following command
$ # inside the guest to install C and C++compilers
guest$ su -c "apt-get installbuild-essential"
先不要使用
$ cp s2e_disk.raw s2e_disk.raw.s2e
而是先配置ssh服务,是的guest端能够使用scp命令来和host端互相传送文件(具体配置看这篇文章:http://blog.csdn.net/jayxujia123/article/details/34125791)
使用scp时的相关说明:
使用scp来获取host的文件时,首先需要两边的hosts文件都有对方的ip等
例如机器a的ip为192.168.1.1,host名字为ubuntu
机器b的ip为10.0.1.1,host名字为hust
则在a机器的etc/hosts文件中要加入10.0.0.1 hust
b机器的etc/hosts文件中要加入192.168.1.1 ubuntu
接着,如何是b机器需要a机器的某个文件,则a机器需要安装ssh服务。
另外,ssh搭建好后,可以在guest端通过scp命令进行文件的上传与下载:
a.在guest端下载host上面的文件
guest$ scp <your_login_on_host>@<your_host_name>:path/to/tutorial1.c.
b.在guest端上传文件到host(建议是先上传到host的/tmp目录,然后再转移,权限问题)
guest$ scp file <your_login_on_host>@<your_host_name>:/tmp
进入快照保存的系统:
./qemu-system-i386 your_image.raw.s2e -loadvm your_snapshots
进入guest系统后 alt+ctrl+2可以进入monitor进行快照管理,具体可参见这篇文章:
http://www.tuicool.com/articles/q2YnIf
ok,scp可以复制文件后,就在guest将host端的从git上下载的项目全部拷贝到guest端(主要是s2e中的guest这个文件夹和include文件夹,尽量全部拷贝)
拷贝完后就可以回到书册中,运行
$ cp s2e_disk.raw s2e_disk.raw.s2e
之后的话“ExperimentalKVM Snapshot Support”这一小节我也没有成功,不知道为什么
3.Quickly Uploading Programs to the Guestwith s2eget
本章中的“Running s2eget”一节可以忽视,这一节之前的做完后直接看我下面的说明即可。
这一节主要就是解决在没有网络的guest端如何从host端获取数据的问题,前提就是我们前面已经将s2e项目代码已经从host端拷贝到了guest里面了。
s2eget工作的大致步骤以及原理如下图:
首先使用
$S2EDIR/build/i386-softmmu/qemu-system-i386your_image.raw.s2e
命令来启动在第二节中生成的s2e格式文件,然后用root身份进入我们之前拷贝的s2e项目目录中,具体步骤以及位置如下,按照下面的做就可以完成s2eget工具的编译工作了。
记住你在host机器上的config.lua中的basedirs地址,比如我是/home/s2e/S2EDIR/s2e文件夹,那么我直接在guest机器上此时使用
S2eget s2e.refresh_project.py
就可以将host中的/home/s2e/S2EDIR/s2e/ s2e.refresh_project.py文件拷贝到guest当前目录下。
以上就是s2eget工具的作用
4. Testing a Simple Program with S2E
本章是重点,有一些地方提前说明一下,主要是从“Running the Program in S2E”这一节开始,前面的基本可以按照手册做,注意以下几点:
这个命令:
$ $S2EDIR/build/qemu-release/i386-softmmu/qemu-system-i386-net none your_image.raw.s2e
这是S2E **disabled**模式,这种模式可以通过在guest端使用Ctrl + Alt + 2 然后输入'savevm 1'来保存快照(快照名为1)
但是这个命令:
$S2EDIR/build/qemu-release/i386-s2e-softmmu/qemu-system-i386-net none your_image.raw.s2e -loadvm 1 -s2e-config-file config.lua-s2e-verbose
是 S2E ENABLED模式,这种模式不能保存快照。
以上两种模式因为都带有参数-net none 所以不能上网,但是这个时候我们的s2e格式的镜像文件中已经有了s2eget工具,所以也可以完成从host端复制文件的操作。
以上两种模式的区别在于一个是使用i386-softmmu下的文件,一个是使用i386-s2e-softmmu下的文件,注意一点,i386-softmmu下的qemu-system-i386这个没有-s2e-config-file和-s2e-verbose这个参数,千万不要弄错了。
那么,在这里,有网友也提出了另外一种解决如果事先在guest中传入文件的方法,我们之前的思路是这样:
现在,网友提出的思路是这样,(前提是我们没有在使用raw格式时给guest系统传入s2e项目文件,有了我们就不用传了嘛),在我们使用:
$S2EDIR/build/qemu-release/i386-softmmu/qemu-system-i386-net none your_image.raw.s2e
这个命令时,不要-net none,也即使用这个命令:
$S2EDIR/build/qemu-release/i386-softmmu/qemu-system-i386your_image.raw.s2e
这个时候是可以上网的,也就是说可以和host通讯,那么我们就可以完成给guest系统传入s2e项目文件的任务,接着我们按照“Quickly Uploading Programs to the Guest with s2eget”这一章里面的那个编译s2eget的图片来进行编译得到s2eget工具,然后我们在guest端使用Ctrl + Alt+ 2 然后输入'savevm xxx'来保存快照,接着使用命令:
$S2EDIR/build/qemu-release/i386-s2e-softmmu/qemu-system-i386-net none your_image.raw.s2e -loadvm 1 -s2e-config-file config.lua-s2e-verbose
来进行下面的实验,这样也是可以的。
另外,在最近的搜索中,发现了清华的吴师兄曾经弄过这个,这里也给出相关的连接,里面的信息都还挺实在的:
除零漏洞在klee和S2E中的检测
Ubuntu10.10(64位) + Qemu 如何让guest上网?
还有关于s2e,klee的一个csdn博客:点击这里(感觉还不错,介绍性的)
转载请注明出处:http://blog.csdn.net/jayxujia123/article/details/34126151
作者邮箱:[email protected]