mcsema, 用于将 x86,amd64和aarch64程序二进制程序提升到LLVM位码的框架

分享于 

14分钟阅读

GitHub

  繁體 雙語
x86 to machine code translation framework
  • 源代码名称:mcsema
  • 源代码网址:http://www.github.com/trailofbits/mcsema
  • mcsema源代码文档
  • mcsema源代码下载
  • Git URL:
    git://www.github.com/trailofbits/mcsema.git
    Git Clone代码到本地:
    git clone http://www.github.com/trailofbits/mcsema
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/trailofbits/mcsema
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    McSema Slack Chat

    McSema是一个可以执行的提升器。 它从本地机器代码到LLVM位码转换("的") 可执行二进制代码。 LLVM位码是最初为可以执行的可以重定向LLVM编译器创建的一个程序中间表示形式,但它对于直接执行程序分析是非常有用的,但它也不可能直接对可执行文件执行。

    McSema使分析师能够发现和追溯针对安全 Bug的二进制程序,独立验证供应商源代码,并生成高代码覆盖率的应用程序。 McSema不仅仅用于 static 分析。 lifted bitcode也可以是带有的 fuzzed,这是一种基于LLVM的工具,否则需要目标源代码。 lift位码甚至可以是编译返回到一个运行程序。 ! 这是称为 static 二进制重写。二进制翻译或者二进制重编译的过程。

    McSema支持 Linux ( ELF ) 和 Windows ( PE ) 执行,并了解大多数x86和amd64指令,包括整数。X87.MMX。SSE和AVX操作。 AARCH64 ( ARMv8 ) 指令支持进行中。

    使用McSema是两个步骤: 控制流程恢复和指令转换。 使用 mcsema-disass 工具执行控制流恢复,该工具依赖于 IDA Pro来分解二进制文件并生成控制流图。 然后使用 mcsema-lift 工具执行指令转换,该工具将控制流图转换为LLVM位码。 在此基础上,实现了 mcsema-lift的指令翻译功能,实现了 remill 库的。remill的开发是重构和改进McSema的结果,首先是用McSema版本 2.0.0引入的。 阅读以下有关 remill的更多信息。

    McSema和 remill 是开发的,并通过对of和美国国防部的研究进行追踪。

    插件生成状态

    母版
    LinuxBuild Status

    特性

    • 将 32 - 和 64位 Linux ELF和 Windows PE二进制文件提升到位码,包括每个平台的可执行文件和共享库。
    • 支持x86和x86-64指令的大子集,包括大部分整数。X87.MMX。SSE和AVX操作。
    • McSema在 Windows 和Linux上运行,已经在 Windows 7.10.Ubuntu ( 14.04,16.04 ) 和openSUSE上进行了测试。
    • McSema可以跨 lift: 它可以在 Windows 上转换Linux二进制文件,或者在Linux上转换 Windows 二进制文件。
    • 输出位码与LLVM工具链( 版本 3.5和更高版本) 兼容。
    • 可以分析翻译的位码,或者将它的重新编译为一个新的。工作可以执行的可执行文件,它的功能与原始文件相同。

    用例

    为什么将二进制文件转换为二进制文件的人?

    • 二进制修补和修改。 提升到 LLVM IR可以清晰地修改目标程序。 你可以运行混淆或者强化传递。添加特性。删除特性。重写特性,甚至修复那些讨厌的错误。语法错误或者疯狂逻辑。 完成后,可以将新创建重新编译为新的二进制运动。 我们可以使用网络大挑战将挑战二进制文件转换为位码,插入内存安全检查,然后发出运行二进制文件。

    • 带 KLEE的符号执行。KLEE 操作LLVM位码,通常是通过向LLVM工具链提供源来生成的。 McSema可以将二进制文件提升为LLVM位码,允许KLEE对以前不可用的目标代码进行操作。 参见我们的演练演示如何在符号迷宫上运行 KLEE。

    • 使用现有的llvm工具 KLEE不是唯一可以用于在位码上使用的工具。 run lifted bitcode bitcode bitcode bitcode bitcode passes passes passes passes passes passes passes passes passes passes passes passes。

    • 分析二进制代码而不是源代码。 源级别分析很好,但不总是可能( 比如。 你没有源),即使是可以用的,它也缺乏编译器转换。重排序 和优化。 分析实际的二进制保证你分析 true 执行的行为。

    • 编写一套分析工具。 Lifting IR意味着一套分析工具可以同时处理源代码和二进制代码。 维护一组工具可以节省开发时间和精力,并允许一组更好的工具。

    依赖项

    名称版本
    最新
    CMake3.2 +
    Google Protobuf服务2.6.1
    Google旗标记最新
    Google日志记录最新
    测试最新
    英特尔x最新
    3.5 +
    3.5 +
    python2.7
    python 包索引最新
    python-protobuf3.2.0
    6.7 +

    获取和生成代码

    Linux上的插件

    步骤 1: 安装依赖项
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install 
     git 
     cmake 
     python2.7 python-pip python-virtualenv 
     wget 
     build-essential 
     gcc-multilib g++-multilib 
     libtinfo-dev 
     lsb-release 
     realpath 

    如果你要使用 IDA Pro进行CFG恢复,也要执行以下操作:

    sudo dpkg --add-architecture i386
    sudo apt-get install zip zlib1g-dev:i386
    步骤 1.5 ( 可选): 为mcsema安装创建一个 virtualenv

    使用 virtualenv 确保mcsema安装不会干扰其他软件包。 这个设置是特别有帮助的,如果你黑入 mcsema,并且希望避免开发代码的全球化。

    mkdir mcsema-ve
    virtualenv mcsema-vecd mcsema-vesource bin/activate
    修复pro安装的IDA python ( Ubuntu 14.04 )

    注意:如果在 64位使用rda和of并不使用系统 python,则可以手动向模块的rda添加 protobuf 库。

    # Python module dir is generally in/usr/lib or/usr/local/libIDAPYTHON=/home/$USER/ida-6.9/python/lib/python27.zip
    GOOGLEMODULE=$(python -c "import os; import sys; import google; sys.stdout.write(os.path.dirname(google.__file__))")pushd${GOOGLEMODULE}/..
    chmod +w ${IDAPYTHON}zip -rv ${IDAPYTHON} google/
    chmod -w ${IDAPYTHON}popd
    步骤 2: 克隆存储库

    下一步是克隆 Remill插件存储库。 然后我们将McSema存储库克隆到Remill的tools 子目录中。 这就像是如何分开分发voiceover和 tmodel,而voiceover源代码需要放入到tmodel目录的工具中。

    注意构建时,应该始终使用特定的Remill提交散列( 我们测试的那个)。 这里哈希可以在。remill_commit_id文件中找到。

    git clone --depth 1 https://github.com/trailofbits/mcsema.gitexport REMILL_VERSION=`cat./mcsema/.remill_commit_id`git clone https://github.com/trailofbits/remill.gitcd remill
    git checkout -b temp ${REMILL_VERSION}mv.. /mcsema tools
    步骤 3: 生成 McSema

    McSema是Remill的子项目,类似于Clang是LLVM的子项目。 为此,我们调用Remill脚本构建来构建Remill和 McSema。 它还将下载Remill所需的所有依赖。

    下面的脚本将在 remill-build 目录中构建Remill和 McSema,该目录将放在当前的工作目录。

    if [ -z"${VIRTUAL_ENV}" ]then# no virtualenv; global install for all users. /scripts/build.shelse# found a virtualenv; local install. /scripts/build.sh --prefix $(realpath.. /)fi

    这里脚本接受几个 命令行 选项:

    • --prefix PATH: 将文件安装到 PATH。 默认情况下,PATH/usr/local
    • --llvm-version MAJOR.MINOR: 下载 LLVM MAJOR.MINOR.的预先构建依赖项默认是使用 LLVM 4.0.
    • --build-dir PATH: 在 PATH 中生成所有中间构建文件。 默认情况下,PATH$CWD/remill-build
    • --use-system-compiler: 使用系统编译器工具链( 典型的GCC ) 编译 Remill+McSema。
    步骤 4: 安装 McSema

    下一步是构建代码。

    cd remill-buildif [ -z"${VIRTUAL_ENV}" ]then# no virtualenv; global install for all users requires sudo sudo make installelse# found a virtualenv; local install does not need root make installfi

    安装后,你可以使用 mcsema-disass 来拆卸二进制文件,而 mcsema-lift-4.0 用于解除已经分解的二进制文件。 如果你将 --llvm-version 3.6 指定给 build.sh 脚本,那么你将使用 mcsema-lift-3.6

    步骤 5: 验证你的McSema安装

    为了验证McSema是否正常工作,head integration集成测试文档。 检查你是否可以运行测试并通过测试。

    附加文档

    获取帮助

    如果你遇到问题或者只是想了解更多和贡献,加入帝国的#binary-lifting 通道 Hacking。 或者,你可以在 mcsema-dev@googlegroups.com 加入我们的邮件列表,或者在 mcsema@trailofbits.com 以私人方式发送电子邮件。

    常见问题解答

    你怎么知道McSema和 NAME 从哪里来?

    这是一个激烈的争论。 我们必须探索 NAME的词源来找到答案。 McSema"mc"in最初是 words"机器代码","语义"是"语义。",McSema使用llvm解码器指令来获取机器码字节,并将它的转换成 llvm::MCInst 数据结构。 很有可能"mc"在这种情况下。 不过,即使那些理解 NAME的原因的人也会发现它与美国快速食品节点的喜爱相关。

    为什么我需要 IDA Pro来使用 McSema

    mcsema的目标是二进制转换到二进制转换。 准确的拆卸和控制流量恢复是一个分离和困难的问题。 IDA已经投入了无数小时的工程来获取反汇编权限,而且我们使用现有的工作。 我们知道并非每个人都能获得IDA许可。 我们发布了最初的McSema版本,我们推出了自己的递归下降反汇编程序。 它没有IDA那么好而且也永远不会。 维护损坏的工具从更重要的McSema工作中夺走了宝贵的开发时间。 我们希望最终过渡到更易访问的控制流恢复前端,比如二进制忍者( 我们有一个分支与实验二进制忍者支持。)。 我们非常欢迎pull请求,实现对新控制流恢复前端的支持。

    什么是 Remill为什么McSema需要它?

    Remill 是McSema用来将单个机器代码指令提升为 LLVM IR的库。 你可以把McSema看作是 Remill,因为Clang是 LLVM。 remill的范围很小:它只关注指令语义,它为 x86.x86-64和AArch64指令语义提供语义。 mcsema的范围要大得多: 它专注于提升整个程序。 为这里,McSema必须提升各个指令,但提升程序比指令还要多,有代码和数据交叉引用。

    我是一个学生,我想为你提供帮助: 我如何帮助

    我们愿意为你提供帮助,帮助你改善 McSema。 我们有几个在中标记 intern_project的项目思想问题追踪器。 你不限于那些项目: 如果你想要在McSema中有一个很好的特性,让我们知道,我们将。 只需在我们的 Slack 频道或者通过 mcsema@trailofbits.com 联系我们,让我们知道你想做什么,为什么要这样做。


      BIN  BIT  X86  AMD  Binaries