pintool

基本介绍

pin 是 Intel 开发的一个动态二进制插桩工具,提供了丰富的 API 接口,可以监控一些程序运行状态,也可以模拟一些现有处理器不支持的指令。
pintool 是指经过 pin 框架开发后的工具,可以用来完成具体的程序分析和仿真验证。

对于逆向题目,如果 flag 的正确前缀长度与执行指令数量呈正相关,可以借助统计执行指令数量的 Pintool 进行逐字符爆破。

环境搭建

linux

首先在官网上下载 pin 。将下载好我文件解压。

pin-/source/tools/ 的目录下提供了很多已经写好的项目,而我们需要使用的统计指令数量的 pintool 对应的项目位于其中的 ManualExamples 目录下。

在该目录下执行编译该项目

64 位的编译命令为:

make obj-intel64/inscount0.so TARGET=intel64

64 位的编译命令为:

make obj-ia32/inscount0.so TARGET=ia32

例题

[QCTF2018]ollvm

import subprocess, os, string, timefilename = "./ollvm"
cmd = cmd = "./pin -t ~/pin-3.22-98547-g7a303a835-gcc-linux/source/tools/ManualExamples/obj-intel64/inscount0.so -- " + filename+ filename
flag_length = 38
flag_name = "QCTF{"
dic = string.letters + '_' + string.digits + '}{'def runCmd(cmd):res = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)sout, serr = res.communicate()return res.returncode, sout, serr, res.piddef get_count(s):runCmd(cmd + ' ' + s.ljust(flag_length, '?'))with open('inscount.out') as f:return int(f.readline().split(' ')[1])if __name__ == '__main__':delta = -1cnt = get_count(flag_name[0])for i in range(2, len(flag_name) + 1):new_cnt = get_count(flag_name[:i])if delta == -1:delta = new_cnt - cntelse:delta = min([delta, new_cnt - cnt])cnt = new_cntdelta -= int(delta * 0.1)print "delta: " + str(delta)flag = flag_namefor i in range(len(flag), flag_length):for s in dic:new_cnt = get_count(flag + s)print 'current flag: ' + (flag + s).ljust(flag_length, '?') + ' cnt: ' + str(new_cnt)if new_cnt - cnt >= delta:flag += scnt = new_cntbreak


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部