S2e-env环境及编译学习1
Ⅰ、S2e符號(hào)執(zhí)行概述
Ⅱ、前言
對(duì)于S2E做符號(hào)執(zhí)行,當(dāng)前只是了解一些表面的功能,因此本文只是大致記錄本人對(duì)于s2e和符號(hào)執(zhí)行的一點(diǎn)粗淺認(rèn)識(shí)僅供初學(xué)者參考。如果謬誤之處,還希望大家指正,謝謝。
一、S2E和符號(hào)執(zhí)行
首先簡(jiǎn)單描述一下什么是符號(hào)執(zhí)行。我們平常執(zhí)行程序的時(shí)候,使用的都是具體值來(lái)執(zhí)行程序,得到輸出。這種執(zhí)行方式稱為實(shí)際(具體)執(zhí)行(concolic execution)。在使用不同的具體值執(zhí)行程序時(shí),程序可能走不同的路徑,執(zhí)行的行為就可能存在差異。那么怎么才能知道程序可能存在哪些執(zhí)行路徑,進(jìn)而去了解程序各種各樣的執(zhí)行行為呢?
符號(hào)執(zhí)行的核心思想就是使用符號(hào)值來(lái)代替具體值來(lái)執(zhí)行待測(cè)程序。舉個(gè)例子:程序某函數(shù)(方法)如:func(int x, int y)接受兩個(gè)輸入x和y,并輸出兩者中較大的那個(gè)值。
在進(jìn)行符號(hào)執(zhí)行時(shí),將x和y分別賦予符號(hào)值X和Y,之后執(zhí)行程序,并記錄符號(hào)執(zhí)行狀態(tài)(包括:路徑條件,符號(hào)狀態(tài)和程序計(jì)數(shù)器)。碰到分支時(shí),執(zhí)行路徑一分為二,分別代表滿足條件和不滿足條件時(shí)的執(zhí)行路徑。符號(hào)執(zhí)行的所有狀態(tài)構(gòu)成符號(hào)執(zhí)行樹(shù),表示程序的所有執(zhí)行路徑。在符號(hào)執(zhí)行樹(shù)中,節(jié)點(diǎn)表示狀態(tài),箭頭表示狀態(tài)的遷移。(如下圖所示)
在符號(hào)執(zhí)行過(guò)程中,程序的路徑會(huì)隨著程序規(guī)模的增大而急速擴(kuò)大(即“路徑爆炸問(wèn)題”),這個(gè)問(wèn)題會(huì)制約符號(hào)執(zhí)行的性能,為了解決這個(gè)問(wèn)題,V.Chipounov等人提出了選擇符號(hào)執(zhí)行(Selective Symbolic Execution)技術(shù),只對(duì)用戶關(guān)系的代碼符號(hào)化執(zhí)行,對(duì)其余代碼則使用實(shí)際執(zhí)行。
S2E是一個(gè)選擇符號(hào)執(zhí)行工具(平臺(tái)),在Klee、Qemu的基礎(chǔ)上構(gòu)建而來(lái)。Klee用來(lái)進(jìn)行符號(hào)執(zhí)行,Qemu虛擬機(jī)作為符號(hào)執(zhí)行的載體。根據(jù)S2E官方文檔得知,目前S2E提供兩種安裝方案:
1、使用s2e-env.(s2e-env是一個(gè)基于 Python 的工具)
不使用s2e-env,通過(guò)Docker來(lái)構(gòu)建。(詳細(xì)可參考官方文檔,建議是使用第一種,相對(duì)簡(jiǎn)單一些)。(官方文檔:http://s2e.systems/docs/BuildingS2E.html)
下面分析基本的安裝過(guò)程及我所遇到過(guò)的問(wèn)題。
(注:安裝該環(huán)境最好使用ubuntu20.04及以上版本,18.04以下版本可能后續(xù)已不支持)
Ⅲ、S2e-env搭建和代碼分析
一、安裝s2e-env
1、可以使用以下命令從GitHub獲取和build
(a)、安裝git, python3和pip等工具
(b)、拉取s2e-env代碼到本地
git clone https://github.com/s2e/s2e-env.gitcd s2e-env (c)、配置環(huán)境 python3 -m venv venv . venv/bin/activate install --upgrade pip//By default, s2e-env uses https to clone repositories.
//If you want ssh, please edit s2e_env/dat/config.yaml before running pip install.
//If your key is password-protected, use ssh-agent.
(d)、切換到s2e-env的目錄執(zhí)行,執(zhí)行如下命令
// Note: if your pip version is earlier than v19, use the following command:pip install --process-dependency-links .
3、述執(zhí)行沒(méi)有問(wèn)題下,可以試試s2e的命令是否有效,有效則說(shuō)明成功。(如下圖)
二、s2e init流程(創(chuàng)建新環(huán)境)
(一)、s2e init流程:
1、S2E環(huán)境有S2E引擎和相關(guān)工具、一個(gè)或多個(gè)虛擬機(jī)映像和一個(gè)或多個(gè)分析目標(biāo)(稱為“項(xiàng)目”)組成。
要在中創(chuàng)建新的S2E環(huán)境如/home/usr/s2e, 請(qǐng)運(yùn)行:
S2e init /home/usr/s2e
這步的作用主要是在DIR目錄下初始化一個(gè)s2e的環(huán)境,包括安裝一些依賴的工具以及從github上拉取各種代碼和子模塊,該步由于國(guó)內(nèi)網(wǎng)絡(luò)問(wèn)題,容易出現(xiàn)的是repo init失敗。(具體問(wèn)題下文問(wèn)題總結(jié))
完成時(shí)候需要配置環(huán)境如:source /home/usr/s2e/new-s2e/s2e_activate(成功后有提示,路徑是由創(chuàng)建者決定并不都是一樣)
這一步正確完成會(huì)有如下提示:
三、s2e init流程代碼分析
(一)、s2e init流程代碼分析:
1、file: s2e_env/manage.py
入口函數(shù):main{(1)、configure_logging配置全局log,(2)、創(chuàng)建CommandManager對(duì)象并調(diào)用execute, execute解析命令,設(shè)置argv參數(shù)。}
解析subcommand(如s2e -help、 s2e init等),
實(shí)際參與執(zhí)行的流程:main —> manager.execute()
2、file: s2e_env/command.py
調(diào)用fetch_command和run_from_argv,此時(shí)以進(jìn)入s2e_env/command.py, fetch_command會(huì)獲取s2e_env/commands目錄下所有模塊對(duì)應(yīng)的命令
通過(guò)run_from_argv調(diào)用execute—>handle, 進(jìn)入s2e_env/commands/init.py}
其中fetch_command()函數(shù)中通過(guò)load_command_class方法來(lái)完成venv虛擬環(huán)境的準(zhǔn)備工作。后續(xù)s2e build和s2e build_image在執(zhí)行腳本是子類方法調(diào)用都會(huì)進(jìn)入venv中的腳本(路徑如:s2e-env/venv/lib/python3.8/site-packages/s2e_env/commands/build.py)
3、file: s2e_env/commands/init.py
(1)、class Command(BaseCommand) -->handle(改函數(shù)會(huì)通過(guò)命令行獲取需要檢查創(chuàng)建的new環(huán)境目錄,如:s2e init /home/usr/new-s2e,
此時(shí)該函數(shù)拿到需要?jiǎng)?chuàng)建的目錄就是/home/usr/new-s2e)。代碼:if not os.path.isdir(env_path)
(2)、創(chuàng)建該目錄后,依次在該目錄中創(chuàng)建s2e環(huán)境需要的各種工作目錄:如:build、images、install、source等。主要執(zhí)行位置:for dir_ in CONSTANTS[‘dirs’]:
(3)、_create_config()函數(shù)創(chuàng)建s2e.yaml文件
(4)、_create_activate_script()函數(shù)創(chuàng)建s2e_activate.sh文件(該文件后續(xù)需要在shell命令行下執(zhí)行,主要是部署環(huán)境變量,便于在任意目錄使用s2e命令)
(5)、_install_dependencies()函數(shù)僅依靠apt-get開(kāi)始Install S2E’s dependencies,如果這一步失敗,則會(huì)進(jìn)入異常處理刪除已經(jīng)創(chuàng)建的工作目錄。
代碼:if os.path.isdir(env_path) and os.getcwd() != env_path:
注:主要是利用apt-get來(lái)下載安裝
(6)、_get_s2e_sources()函數(shù)從https://gerrit.googlesource.com/git-repo下載repo工具,通過(guò)repo開(kāi)始往source中拉取s2e_env的主要代碼
代碼:logger.info(‘Fetching %s from %s’, git_s2e_repo, git_url)
repo.init(u=f’{git_url}/{git_s2e_repo}’, b=manifest_branch,
_out=sys.stdout, _err=sys.stderr)
repo.sync(_out=sys.stdout, _err=sys.stderr)
成功之后有如下提示:
四、、s2e build流程:
(一)、s2e build流程:
1、構(gòu)建S2E,執(zhí)行后下命令
s2e builds2e build 將構(gòu)建所有 S2E 組件,包括 KLEE、QEMU、libs2e、Z3等。這個(gè)過(guò)程耗時(shí)比較久,大約1小時(shí)左右,成功則如下圖所示
注:s2e build耗時(shí)比較長(zhǎng),這個(gè)過(guò)程需要保證網(wǎng)絡(luò)的通暢以及一定的速度,不然容易失敗。
3、接下來(lái),需要構(gòu)建一個(gè)虛擬機(jī)鏡像供分析目標(biāo)使用。構(gòu)建image(虛擬機(jī))s2e提供的虛擬機(jī)有很多種,這次我選擇的是“debian-9.2.1-x86_64”(成功如下圖所示)
s2e image_build debian-9.2.1-x86_64
注:鏡像構(gòu)建過(guò)程會(huì)緩存中間構(gòu)建輸出,.tmp-output該輸出可能會(huì)變得非常大。構(gòu)建映像后,如果磁盤空間存在問(wèn)題,您可能希望刪除此目錄。
五、s2e build流程代碼分析
(一)、s2e build流程代碼分析:
1、file: s2e_env/manage.py
入口執(zhí)行流程:main —> manager.execute()
— 前面已有圖解說(shuō)明,此處不在贅述。—
2、file: s2e_env/command.py
調(diào)用fetch_command和run_from_argv,此時(shí)已經(jīng)進(jìn)入s2e_env/command.py, fetch_command會(huì)獲取s2e_env/commands目錄下所有模塊對(duì)應(yīng)的命令
通過(guò)run_from_argv調(diào)用execute—>handle,
進(jìn)入s2e-env/venv/lib/python3.8/site-packages/s2e_env/commands/build.py。之前venv部署的虛擬環(huán)境},如下代碼所示:
至此由Python腳本轉(zhuǎn)入Makfile開(kāi)始進(jìn)入編譯流程。
3、s2e/build-test2/source/scripts/Makefile
如圖所示,這個(gè)Makefile屬于頂層控制,并未做具體的事情。具體的工作主要有include引入的兩個(gè)Makefile來(lái)完成,可以簡(jiǎn)單認(rèn)為是2個(gè)階段的編譯。其中第一階段會(huì)有一些依賴的下載,需要保持良好的網(wǎng)絡(luò)(會(huì)訪問(wèn)國(guó)外站點(diǎn))
4、s2e/build-test2/source/s2e/Makefile
注:執(zhí)行該Makefile需要依賴cmake工具,在安裝步驟中請(qǐng)注意環(huán)境中是否已經(jīng)準(zhǔn)備。
該Makefile主要完成一下工作:
(a)、檢查環(huán)境中build目錄是否已經(jīng)ready并設(shè)置S2E環(huán)境相關(guān)各種變量(如arch, LLVM等)。
(b)、設(shè)置guest_tools的下載地址
(c)、set各類依賴工具下載地址
(d)、主體編譯任務(wù)如下
(e)、設(shè)置KLEE和LLVM編譯內(nèi)容
(f)、設(shè)置開(kāi)始之前各種依賴工具的下載(大致如下),如果網(wǎng)絡(luò)有問(wèn)題,不妨參考修改本Makefile,使用其他下載方式,下載好后copy在Makefile指定位置即可。
(g)、編譯各類依賴工具(如下圖舉例說(shuō)明)
(h)、編譯libs2e庫(kù)
(i)、部署Guest tools工具并安裝
(j)、第二階段qemu的編譯
s2e/build-test2/source/scripts/Makefile.qemu,這個(gè)Makefike相對(duì)內(nèi)容比較少,僅僅只是針對(duì)qemu的編譯(s2e執(zhí)行時(shí),會(huì)依賴qemu的環(huán)境),內(nèi)容大致如下圖所示:
六、s2e image_build流程代碼分析
(一)、s2e image_build流程:
如命令:`s2e image_build debian-9.2.1-x86_64`其中debian-9.2.1-x86_64是之前s2e build過(guò)程中已經(jīng)在新的環(huán)境目錄new_dir/images中已經(jīng)下載好的。
(二)、s2e image_build流程代碼分析:
1、file: s2e_env/manage.py
入口執(zhí)行流程:main —> manager.execute()
前面已有圖解說(shuō)明,此處不在贅述。
2、file: s2e_env/command.py
調(diào)用fetch_command和run_from_argv,此時(shí)已進(jìn)入s2e_env/command.py, fetch_command會(huì)獲取s2e_env/commands目錄下所有模塊對(duì)應(yīng)的命令
通過(guò)run_from_argv調(diào)用execute—>handle,
進(jìn)入s2e-env/venv/lib/python3.8/site-packages/s2e_env/commands/image_build.py。
image_build.py大致如下代碼所示:
Ⅳ、構(gòu)建一個(gè)新的分析項(xiàng)目
一、創(chuàng)建新項(xiàng)目
完成上面步驟后,現(xiàn)在已經(jīng)有了一個(gè)可用于分析程序的虛擬機(jī)映像(virtual machine image)。接下來(lái)需要?jiǎng)?chuàng)建一個(gè)“項(xiàng)目”來(lái)分析咱們的目標(biāo)程序,而要?jiǎng)?chuàng)建這樣的一個(gè)項(xiàng)目,需運(yùn)行如下命令:
s2e new_project --image <image_name> /path/to/target/binary [target_args...]首先來(lái)看命令的參數(shù)解析:
用一個(gè)例子來(lái)說(shuō)說(shuō)明,有一個(gè)可執(zhí)行程序sample,路徑是/home/usrname/xxx/sample, 虛擬機(jī)路徑是/home/usrname/s2e/new-s2e/images/debian-9.2.1-x86_64, 那么創(chuàng)建一個(gè)符號(hào)執(zhí)行工程的命令是如下:
執(zhí)行后有打印提示如下
二、開(kāi)始執(zhí)行
執(zhí)行完cd /home/usr/s2e/new-s2e/projects/sample && ./launch-s2e.sh后,運(yùn)行命令:s2e run sample會(huì)有如下圖所示提示:
三、查看執(zhí)行結(jié)果
在/home/usrname/s2e/new-s2e/projects/sample中有個(gè)名稱中包含著out的文件夾存放著符號(hào)執(zhí)行的結(jié)果,文件夾內(nèi)容大致如下圖所示:
Ⅴ、構(gòu)建一個(gè)新的分析項(xiàng)目
一、s2e newproject執(zhí)行環(huán)境
1、file: s2e-env/s2e_env/manage.py
main -----> manage.execute() ----> execute(“Identify” subcommand) ---->self.fetch_command(subcommand).run_from_argv(self._argv)fetch_command(subcommand) ---->load_command_class(subcommand) ----> importlib.import_module(f's2e_env.commands.{name}')2、file: /usr/lib/python3.8importlib/init.py
importlib.import_module ----> import_module --→_bootstrap._gcd_import3、file: s2e-env/s2e_env/commands/new_project.py
from s2e_env.command import EnvCommand, CommandErrorfrom s2e_env.commands.project_creation import CGCProject, LinuxProject, AbstractProject........4、file: s2e-env/s2e_env/commands/project_creation/init.py
from .abstract_project import AbstractProject........5、file: s2e-env/s2e_env/commands/project_creation/cgc_project.py
from s2e_env.command import CommandError........6、file: s2e-env/s2e_env/commands/project_creation/base_project.py
from s2e_env.command import CommandErrorfrom s2e_env.commands.recipe import Command as RecipeCommandfrom s2e_env.manage import call_command........7、file: s2e-env/s2e_env/venv/lib/python3.8/site-packages/pwn/toplevel.py
import pwnlib........8、file: s2e-env/s2e_env/venv/lib/python3.8/site-packages/pwnlib/init.py
for module in __all__:importlib.import_module('.%s' % module, 'pwnlib')--------------------------- __all__ = ['args','asm','atexception','atexit','commandline','constants','context','data','dynelf','encoders','elf','exception','fmtstr','gdb','libcdb','log','memleak','pep237','regsort','replacements','rop','runner','shellcraft','term','tubes','ui','useragents','util','adb','update', ]9、file: s2e-env/s2e_env/venv/lib/python3.8/site-packages/pwnlib/term/unix_termcap.py
if cache is None:init() s = cache.get(cap) if not s:s = curses.tigetstr(cap)if s is None:s = curses.tigetnum(cap)if s == -2:s = curses.tigetflag(cap)if s == -1:# default to empty string so tparm doesn't fails = ''else:s = bool(s)cache[cap] = s # if `s' is not set `curses.tparm' will throw an error if given arguments if args and s:return curses.tparm(s, *args) else:return s10、file: s2e-env/s2e_env/venv/lib/python3.8/site-packages/pwnlib/term/text.py
class Module(types.ModuleType):def __init__(self):self.__file__ = __file__self.__name__ = __name__self.num_colors = 8self.has_bright = self.num_colors >= 16self.has_gray = self.has_brightself.when = 'auto'self._colors = {'black': 0,'red': 1,'green': 2,'yellow': 3,'blue': 4,'magenta': 5,'cyan': 6,'white': 7,}self._reset = termcap.get('reset')self._attributes = {}for x, y in [('italic' , 'sitm'),('bold' , 'bold'),('underline', 'smul'),('reverse' , 'rev')]:s = termcap.get(y)if not hasattr(s, 'encode'):s = s.decode('utf-8')self._attributes[x] = sself._cache = {}.......11、file: s2e-env/s2e_env/venv/lib/python3.8/site-packages/pwn/init.py
pwnlib.args.initialize()12、file: s2e-env/s2e_env/commands/recipe.py
from s2e_env.command import ProjectCommand......13、file:s2e-env/s2e_env/commands/project_creation/base_project.py
class BaseProject(AbstractProject):......14、file:s2e-env/s2e_env/commands/project_creation/cgc_project.py
class CGCProject(BaseProject):......15、file:s2e-env/s2e_env/commands/project_creation/linux_project.py
from s2e_env.analysis.elf import ELFAnalysis......16、file:s2e-env/s2e_env/analysis/elf.py
from elftools.elf.dynamic import DynamicSegment from elftools.elf.elffile import ELFFile from elftools.elf.sections import SymbolTableSectionfrom s2e_env import CONSTANTSclass ELFAnalysis:"""Support class for doing some simple static analysis on ELF files."""def __init__(self, elf_path):self._elf_path = elf_pathself._elf_file = Noneself._elf = Nonedef __enter__(self):self._elf_file = open(self._elf_path, 'rb')self._elf = ELFFile(self._elf_file)return self.......二、s2e newproject執(zhí)行流程
1、file: s2e_env/manage.py
入口函數(shù):main{(1)、configure_logging配置全局log,(2)、創(chuàng)建CommandManager對(duì)象并調(diào)用execute, execute解析命令,設(shè)置argv參數(shù)。
解析subcommand(如s2e -help、 s2e init等),
2、file: s2e_env/command.py
調(diào)用fetch_command和run_from_argv,此時(shí)進(jìn)入s2e_env/command.py, fetch_command會(huì)獲取s2e_env/commands目錄下所有模塊對(duì)應(yīng)的命令
通過(guò)run_from_argv調(diào)用execute—>handle, 進(jìn)入s2e_env/commands/init.py}
3、file: s2e_env/manage.py self.fetch_command(subcommand).run_from_argv(self._argv) —> run_from_argv(self._argv)
4、file: s2e_env/command.py BaseCommand::execute(153, 175)–>handle
5、file: s2e_env/commands/new_project.py 該模塊的handle函數(shù)被調(diào)用,
6、file: s2e_env/commands/linux_project.py //(class LinuxProject(BaseProject),這里通過(guò)基類構(gòu)造函數(shù)調(diào)入基類)
class LinuxProject(BaseProject):supported_tools = ['pov']def __init__(self):super().__init__('bootstrap.linux.sh', 's2e-config.linux.lua')def _is_valid_image(self, target, os_desc):return is_valid_arch(target.arch, os_desc) and 'elf' in os_desc['binary_formats']def _analyze_target(self, target, config):with ELFAnalysis(target.path) as elf:config['dynamically_linked'] = elf.is_dynamically_linked()config['modelled_functions'] = elf.get_modelled_functions()def _finalize_config(self, config):config['project_type'] = 'linux'7、file:s2e_env/commands/project_creation/base_project.py
a、第6步通過(guò)基類拷貝構(gòu)造函數(shù),調(diào)用到此處
b、這里父類(class BaseProject)的構(gòu)造函數(shù)拿到2個(gè)shell的字符串參數(shù),然后返回class LinuxProject(BaseProject),繼續(xù)執(zhí)行。
c、重新返回第5步調(diào)用,call_command,這里調(diào)用回到file: s2e_env/manage.py的call_command重新調(diào)用ommand.execute(這里應(yīng)該有一個(gè)調(diào)用堆棧)
d、調(diào)用至file: s2e_env/command.py BaseCommand::execute(153, 175)–>handle
e、此時(shí)調(diào)用進(jìn)入file:s2e_env/commands/project_creation/AbstractProject_project.py(class BaseProject(AbstractProject)的基類)。self._create()函數(shù)
8、file:s2e_env/commands/project_creation/AbstractProject_project.py
a、第7步調(diào)用進(jìn)入子類函數(shù):def _create_bootstrap(self, project_dir, config)
b、在子類進(jìn)行一些列創(chuàng)建,后返回
9、file:file:s2e_env/commands/project_creation/AbstractProject_project.py
a、子類完成創(chuàng)建動(dòng)作后返回。
Ⅵ、s2e_env搭建問(wèn)題總結(jié)
問(wèn)題1:執(zhí)行pip install .安裝部分依賴軟件時(shí)有可能出現(xiàn)訪問(wèn)站點(diǎn)失敗的問(wèn)題。
問(wèn)題原因:
2、需要給虛擬機(jī)命令行配置代理,確保其可以正常訪問(wèn)外部站點(diǎn)。
解決方法:
1、 終端運(yùn)行如下命令:
export http_proxy=’IP : 端口’
export https_proxy=’IP : 端口’
2、如果上述方式不能解決,則需配置pip工具的proxy或者直接執(zhí)行如下命令
pip3 --proxy http://IP : 端口 install .(如:pip3 --proxy http://192.168.0.X:108X install .)
3、給wget配置代理:
(a)、 cd ~
(b)、 vim .wgetrc
?、增加如下命令
proxy_user = user
proxy_password = password
use_proxy = on
問(wèn)題2、執(zhí)行命令后,許多站點(diǎn)可以ping通,但是無(wú)法訪問(wèn)
問(wèn)題解決:
(1)、備份apt的source.list文件(sudo cp /etc/apt/sources.list /etc/apt/sources.list.bk)
(2)、替換apt的源,如用阿里的源(https://www.cnblogs.com/zqifa/p/12910989.html)
問(wèn)題3、ssh執(zhí)行報(bào)錯(cuò)
問(wèn)題原因:
缺失ssh相關(guān)組件和依賴
問(wèn)題解決:
執(zhí)行如下命令解決:
sudo apt-get autoremove openssh-client
sudo apt-get install openssh-client openssh-sftp-server openssh-server ssh
sudo apt-get install ssh-askpass
問(wèn)題4、ssh拉取代碼報(bào)權(quán)限錯(cuò)誤
問(wèn)題原因:
本地git賬戶信息配合,并與github郵箱關(guān)聯(lián)
問(wèn)題解決:
參考文檔:https://blog.csdn.net/qq_34942306/article/details/104585821
過(guò)程說(shuō)明:成功之后會(huì)有如下提示,許執(zhí)行source及build
問(wèn)題5:repo 拉取代碼失敗
問(wèn)題原因:repo工具沒(méi)有安裝成功,且有可能repo找不到python
問(wèn)題解決:
sudo apt-get install repo
問(wèn)題6:build時(shí)有可能出現(xiàn)tar解壓失敗問(wèn)題
問(wèn)題原因:
1、可能是拉取的代碼源文件所損壞(查看源文件大小)
2、配置~/.wgetrc文件
http_proxy = http://your_proxy:port
https_proxy = http://your_proxy:port
問(wèn)題解決:
刪除生成文件中的build目錄。重新執(zhí)行一遍builds2e init xxx。
問(wèn)題7:KVM interface not found
問(wèn)題解決:
出現(xiàn)這個(gè)問(wèn)題如果使用的是虛擬機(jī)說(shuō)明虛擬機(jī)沒(méi)有開(kāi)CPU虛擬化(設(shè)置后重啟)。如果是真機(jī),那么可能是CPU不支持虛擬化。
問(wèn)題8:如果github部分站點(diǎn)無(wú)法訪問(wèn),代理配置又查不到問(wèn)題
問(wèn)題解決:
直接對(duì)/etc/hosts文件進(jìn)行配置
1、使用命令sudo vim /etc/hosts增加報(bào)錯(cuò)的站點(diǎn)ip(如下圖所示)
問(wèn)題9:git拉取報(bào)錯(cuò):GnuTLS recv error(-54): Error in the full function
問(wèn)題原因:可能是網(wǎng)速緩慢,中斷,git緩存不夠?qū)е?br /> 問(wèn)題解決:直接對(duì)git增加網(wǎng)絡(luò)代理和緩存(如下圖所示)
問(wèn)題10:build image出現(xiàn)image.raw報(bào)錯(cuò)
問(wèn)題原因:
1、在該編譯過(guò)程中需要啟動(dòng)qemu進(jìn)程,此時(shí)檢查并沒(méi)有qemu進(jìn)程。
2、懷疑是自己下載配置的代理proxychinas,執(zhí)行命令是使用了該代理導(dǎo)致
執(zhí)行的命令:proxychinas s2e image_build debian-9.2.1-x86_64
問(wèn)題解決:
1、執(zhí)行命令中刪除proxychinas即:s2e image_build debian-9.2.1-x86_64
2、正常執(zhí)行時(shí)如下圖所示:
至此,s2e-env的環(huán)境搭建基本完畢。
注:在build image過(guò)程中會(huì)啟動(dòng)qemu,使用xshell類似終端,可能造成失敗。
總結(jié)
以上是生活随笔為你收集整理的S2e-env环境及编译学习1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android 键盘快捷指令
- 下一篇: 被社会毒打的20年毕业的后端