Binary-Instrumentation-Analysis

实验目的

学习一种名为二进制插桩的技术。

实验原理

二进制插桩技术能够在二进制程序的任何位置插入几乎无限的代码,以观察或修改该二进制程序的行为。

实验环境

1. 使用 binary 虚拟机,即在 Lab 2 中已经配置过的环境(包括时间戳)。

2. 实验所需文件位于/home/binary/code/chapter9 目录。

Task 1:Pin 使用入门

步骤:

1、输入 cd /pin/pin-3.6-97554-g31f0a167d-gcc-linux/source/tools/ManualExamples 和 make obj-intel64/inscount0.so TARGET=intel64 指令编译生成 inscount0.so

输出结果

2、输入 ~/pin/pin-3.6-97554-g31f0a167d-gcc-linux/pin -t obj-intel64/inscount0.so -o obj-intel64/inscount0.log -- /bin/ls指令执行插桩分析,并查看inscount0.log 文件中显示得到执行过的指令总数。

输出结果

输出结果

Task 2:Profiling with Pin

3.3.1 从起始处分析应用程序

步骤:

1、输入 make obj-intel64/profiler.so TARGET=intel64 指令编译生成 profiler.so

输出结果

2、输入  ~/pin/pin-3.6-97554-g31f0a167d-gcc-linux/pin -t ./profiler/obj-intel64/profiler.so -c -s -- /bin/true 指令对/bin/true执行分析。

输出结果

3.3.2 将 Profiler 附加到运行中的进程

步骤:

1、输入 echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope指令暂时禁用安全机制;输入 nc -l -u 127.0.0.1 9999 指令获取 PID。

输出结果

2、输入  ~/pin/pin-3.6-97554-g31f0a167d-gcc-linux/pin -pid 6594 -t ./profiler/obj-intel64/profiler.so -c -s 指令对 PID 为 6594 的进程执行分析。输入 echo \"Testing the profiler\" \| nc -u 127.0.0.1 9999 指令使用另一个 netcat 进程向监听进程发送消息"Testing the profiler"。使用 fg 命令把 netcat 监听进程带到前台,并终止该进程。

输出结果

Q:根据 Pin 执行结果,使用了哪些系统调用?

A:系统调用 0: read,执行了 2 次,占比 28.57%
系统调用 1: write,执行了 1 次,占比 14.29%
系统调用 7: poll,执行了 2 次,占比 28.57%
系统调用 42: connect,执行了 1 次,占比 14.29%
系统调用 45: recvfrom,执行了 1 次,占比 14.29%

输出结果

Task 3:Automatic Binary Unpacking with Pin

3.4.2 测试脱壳器

步骤:

1、输入 cp /bin/ls packedupx packed 指令对测试二进制文件进行加壳。

输出结果

2、输入 sudo apt-get install --reinstall libxcb-xinerama0指令安装缺少的运行库,安装IDA。

输出结果

输出结果

3、在IDA中分析 packed 文件,发现其被加壳。

输出结果

4、输入  /pin/pin-3.6-97554-g31f0a167d-gcc-linux/pin -t obj-intel64/unpacker.so -- ./packed 指令执行解密。

输出结果

5、输入 head unpacker.log 指令查看解密后的文件。

输出结果

6、输入 file unpacked.0x400000-0x41da64_entry-0x40000c指令查看解密后的文件类型。

输出结果

7、输入 strings unpacked.0x400000-0x41da64_entry-0x40000c指令看到脱壳后的二进制文件中包含许多可读的字符串,这表明脱壳成功。

输出结果

8、使用IDA在脱壳后的二进制文件中找到更多的函数,这也说明脱壳是成功的。

输出结果

输出结果

输出结果

9、输入 objdump -M intel -d /bin/ls > result_lsobjdump -M intel -b binary -mi386 -Mx86-64 -D unpacked.0x400000-0x41da64_entry-0x40000c > result_unpack 指令对比加壳前后的汇编代码.

输出结果

以 0x2a00处代码为例进行比较。可以看到除了代码地址不同外,二者其余的代码是相同的。地
址不同是因为 objdump 命令缺少节头表而不知道脱壳的二进制文件的预期加载地址。

输出结果