欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]CTF2017 第十四题 半盲道人cm 解题报告

[原创]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

会生成非常长的代码,在进行找出规律、正则替换、手动美化后,成为这样

        28行

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功