[原创]CTF2017 第十四题 半盲道人cm 解题报告
CTF2017 第十四题 半盲道人cm
前言
因比较忙,后来抽空才补的 writeup,渡。 大的 writeup,已经分析的非常彻底了,所以本文就从虚拟机伪码生成开始阐述不同的部分
伪码生成
先上解码代码
with open("CTF.exe", "rb") as f:
f.seek(0x40ac0)
code = f.read(0x1c729)
# 先仿造程序逻辑生成指令对
cmds = []
stack = []
for i in xrange(len(code)):
x = ord(code[i])
if x == 62:
cmds.append([1, 0])
elif x == 60:
cmds.append([2, 0])
elif x == 43:
cmds.append([3, 0])
elif x == 45:
cmds.append([4, 0])
elif x == 46:
cmds.append([5, 0])
elif x == 44:
cmds.append([6, 0])
elif x == 91:
cmds.append([7, 0])
stack.append(i)
elif x == 93:
t = stack.pop()
cmds.append([8, t])
cmds[t][2] = i
elif x == 0:
pass
else:
assert False
# 生成伪代码
bufp = 0
tabs = 1
for i in xrange(len(cmds)):
x, p = cmds[i]
if x == 1:
bufp += 1
elif x == 2:
bufp -= 1
elif x == 3:
print "{0}++ [{1}]".format('\t'*tabs, bufp)
elif x == 4:
print "{0}-- [{1}]".format('\t'*tabs, bufp)
elif x == 5:
print "{0}[{1}] == check_next".format('\t'*tabs, bufp)
elif x == 6:
print "{0}[{1}] = key_next".format('\t'*tabs, bufp)
elif x == 7:
print "{0}[{1}] {{".format('\t'*tabs, bufp)
tabs += 1
elif x == 8:
tabs -= 1
print "{0}}} [{1}]".format('\t'*tabs, bufp)
else:
assert False会生成非常长的代码,在进行找出规律、正则替换、手动美化后,成为这样
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
复制成功
