利用 Docker 安装 Triton 和 PinTools 进行二进制分析

利用 Docker 安装 Triton 和 PinTools 进行二进制分析

Triton 和 PIN 两个框架/工具常用于二进制分析,结合 PIN 对执行轨迹的记录以及 Triton 的符号执行、污点引擎等功能,可以开发出很多有用的工具。

但是 Triton 和 PIN 的配置相对不是十分容易上手,安装配置过程相对其他工具而言不是十分顺畅,另外,由于环境配置,相当的一部分开发人员依赖于 Docker 建立的容器化实验环境,可能在 Docker 中安装和运行 Triton 以及 PIN 还有其他一些难以解决的问题,特写此博客用于记录实验中的 Triton 和 PIN 在 Docker 中的安装。

1) 直接下载使用最新版本的 Ubuntu 镜像作为基础镜像,

docker pull ubuntu:lates

2)建立一个新的容器,

docker run --name Triton -ti -v //e/dba:/home --privileged ubuntu bash

参数详解: --name Triton 容器名字为 Triton;-ti 主机共享绑定容器的终端输入输出,便于显示和输入信息;-v //e/dba:/home 将主机的 E:\dba 目录挂载到容器中的 /home 目录;–privileged 容器设置运行特权,这里设置很关键,关系到能否正常运行 PIN Tools。

3)容器中更新 Ubuntu 源,

# 此处已经在容器中运行,容器默认是 root 用户,有需要可以更改
tee /etc/apt/sources.list << EOF
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
EOF

4)替换源之后更新源、安装更新、安装必要依赖

apt-get update
apt-get upgrade
apt-get install  libcapstone-dev libboost-dev  libopenmpi-dev build-essential cmake libpython-all-dev  python

5)由于 Ubuntu 源中的 Z3 版本不适合 Triton,故手动下载编译,

git clone https://github.com/Z3Prover/z3
python scripts/mk_make.py
cd build
make
sudo make install

6)安装完毕后开始进行 PIN 的下载解压、Triton 的安装,

wget -c http://software.intel.com/sites/landingpage/pintool/downloads/pin-2.14-71313-gcc.4.4.7-linux.tar.gz
tar -zxf pin-2.14-71313-gcc.4.4.7-linux.tar.gz
cd pin-2.14-71313-gcc.4.4.7-linux/source/tools/
git clone https://github.com/JonathanSalwan/Triton.git
cd Triton
mkdir build
cmake -DPINTOOL=on -DKERNEL4=on ..
make -j8
make install

注意 Triton 只能和 71313 版本的 PIN 联合使用

7)安装完成后建立符号连接,便于使用

ln -s /home/pin-2.14-71313-gcc.4.4.7-linux/source/tools/Triton-master/build/triton /usr/bin/triton

至此安装完毕,测试运行,

root@057c56b07971:/# triton
You need to specify a script
Syntax: ./triton <your_script.py> <target binary> [target binary args]
root@057c56b07971:/#  

8)使用脚本运行查看结果,

root@057c56b07971:/# triton /home/pin-2.14-71313-gcc.4.4.7-linux/source/tools/Triton-master/src/examples/python/ir.py ls
0x400000: mov rax, qword ptr [rip + 0x13b8]
         (define-fun ref!0 () (_ BitVec 64) (concat (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8))) ; MOV operation
         (define-fun ref!1 () (_ BitVec 64) (_ bv4194311 64)) ; Program Counter

0x400007: lea rsi, qword ptr [rbx + rax*8]
         (define-fun ref!2 () (_ BitVec 64) (bvadd (_ bv0 64) (bvadd (_ bv0 64) (bvmul ref!0 (_ bv8 64))))) ; LEA operation
         (define-fun ref!3 () (_ BitVec 64) (_ bv4194315 64)) ; Program Counter

0x40000b: lea rsi, dword ptr [ebx + eax*8 + 0xa]
         (define-fun ref!4 () (_ BitVec 64) ((_ zero_extend 32) (bvadd (_ bv10 32) (bvadd (_ bv0 32) (bvmul ((_ extract 31 0) ref!0) (_ bv8 32)))))) ; LEA
operation
         (define-fun ref!5 () (_ BitVec 64) (_ bv4194321 64)) ; Program Counter

0x400011: pmovmskb edx, xmm1
         (define-fun ref!6 () (_ BitVec 64) ((_ zero_extend 32) ((_ zero_extend 16) (concat ((_ extract 127 127) (_ bv0 128)) ((_ extract 119 119) (_ bv0 128)) ((_ extract 111 111) (_ bv0 128)) ((_ extract 103 103) (_ bv0 128)) ((_ extract 95 95) (_ bv0 128)) ((_ extract 87 87) (_ bv0 128)) ((_ extract 79 79) (_ bv0 128)) ((_ extract 71 71) (_ bv0 128)) ((_ extract 63 63) (_ bv0 128)) ((_ extract 55 55) (_ bv0 128)) ((_ extract 47 47) (_ bv0 128)) ((_ extract 39 39) (_ bv0 128)) ((_ extract 31 31) (_ bv0 128)) ((_ extract 23 23) (_ bv0 128)) ((_ extract 15 15) (_ bv0 128)) ((_ extract 7 7) (_ bv0 128)))))) ; PMOVMSKB operation
         (define-fun ref!7 () (_ BitVec 64) (_ bv4194325 64)) ; Program Counter

0x400015: mov eax, edx
         (define-fun ref!8 () (_ BitVec 64) ((_ zero_extend 32) ((_ extract 31 0) ref!6))) ; MOV operation
         (define-fun ref!9 () (_ BitVec 64) (_ bv4194327 64)) ; Program Counter

0x400017: xor ah, 0x99
         (define-fun ref!10 () (_ BitVec 64) (concat ((_ extract 63 16) ref!8) (concat (bvxor ((_ extract 15 8) ref!8) (_ bv153 8)) ((_ extract 7 0) ref!8)))) ; XOR operation
         (define-fun ref!11 () (_ BitVec 1) (_ bv0 1)) ; Clears carry flag
         (define-fun ref!12 () (_ BitVec 1) (_ bv0 1)) ; Clears overflow flag
         (define-fun ref!13 () (_ BitVec 1) (bvxor (bvxor (bvxor (bvxor (bvxor (bvxor (bvxor (bvxor (_ bv1 1) ((_ extract 0 0) (bvlshr ((_ extract 15 8) ref!10) (_ bv0 8)))) ((_ extract 0 0) (bvlshr ((_ extract 15 8) ref!10) (_ bv1 8)))) ((_ extract 0 0) (bvlshr ((_ extract 15 8) ref!10) (_ bv2 8)))) ((_ extract 0 0) (bvlshr ((_ extract 15 8) ref!10) (_ bv3 8)))) ((_ extract 0 0) (bvlshr ((_ extract 15 8) ref!10) (_ bv4 8)))) ((_ extract 0 0) (bvlshr ((_ extract 15 8) ref!10) (_ bv5 8)))) ((_ extract 0 0) (bvlshr ((_ extract 15 8) ref!10) (_ bv6 8)))) ((_ extract 0 0) (bvlshr ((_ extract 15 8) ref!10) (_ bv7 8))))) ; Parity flag
         (define-fun ref!14 () (_ BitVec 1) ((_ extract 15 15) ref!10)) ; Sign flag
         (define-fun ref!15 () (_ BitVec 1) (ite (= ((_ extract 15 8) ref!10) (_ bv0 8)) (_ bv1 1) (_ bv0 1))) ; Zero flag
         (define-fun ref!16 () (_ BitVec 64) (_ bv4194330 64)) ; Program Counter

0x40001a: vmovdqa ymm1, ymm2
         (define-fun ref!17 () (_ BitVec 512) ((_ zero_extend 256) (_ bv0 256))) ; VMOVDQA operation
         (define-fun ref!18 () (_ BitVec 64) (_ bv4194334 64)) ; Program Counter

root@057c56b07971:/#

完成

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值