本文主要是自己在搭建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

作者邮箱:xujiaphp@gmail.com

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐