一次vmp函数的分析 suctf re400

最近太难了 好多比赛 打比赛 看题解啥的 都没有时间写博客了

然后 也在看0day安全那本书

这个是一个老哥给我发的一个题目

他和我说 在做一道题 然后是vmp的 然后我就来试一试

先打开ida 看一下

然后 看一下 vmp保护壳的内容

然后 发现确实是vmp 然后找了几个插件 发现这个插件是可以用的

https://bbs.pediy.com/thread-154621.htm

看雪的巨巨。。。。tql  具体指令还有 操作可以看 帖子的内容

这里是到 关键函数 右键->分析虚拟机->分析虚拟程序

然后到 vmp插件的那个窗口 然后右键->查看->所有指令   然后 右键->查看 ->最终操作

发现了这样的情况

可以看的出 还是很有效果的

然后我们就可以直接对着逆了 其中我们的字符是限制了16位 然后发现这里是 m1 -m16 就是根据 ecx 里面取值 可以推测 就是我们输入的字符 

那么  指令就是 (x+x<<2)<<1  ==(x+x*4)*2->10x

也就是说 是每四个字符 合成一个四位数  然后 进行比较

这里直接用z3库解 

#!/usr/bin/env python3
 
import re



from z3 import *
if __name__ =="__main__":
    s = Solver()
 
    l = [Int('l%d'%i) for i in range(4)]
    for i in l:
        s.add(0<i)
        s.add(i<=9999)

    s.add(l[0]*5+l[1]*4+l[2]*3+l[3]*2==0x130D9)
    s.add(l[0]*4+l[1]*2+l[2]*6+l[3]*3==0x10aef)
    s.add(l[0]*3+l[1]+l[2]*7+l[3]*5==0x11a6b)
    s.add(l[0]*2+l[1]*3+l[2]*5+l[3]==0xbb80)
    if s.check() ==sat:
        m = s.model()
        for i in range(0,4):
            print((int("%s" % (m[l[i]]))),end='')
    else:
        print("error")

总结 :

这个vmp 应该是比较老的一款  而且这个题目出的也不算难

所以这个题目还是相对简单些的,,,,,,。

发布了313 篇原创文章 · 获赞 44 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_41071646/article/details/100150607