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 packed
和 upx 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_ls
和 objdump -M intel -b binary -mi386 -Mx86-64 -D unpacked.0x400000-0x41da64_entry-0x40000c > result_unpack
指令对比加壳前后的汇编代码.
以 0x2a00处代码为例进行比较。可以看到除了代码地址不同外,二者其余的代码是相同的。地
址不同是因为 objdump 命令缺少节头表而不知道脱壳的二进制文件的预期加载地址。