一次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 應該是比較老的一款  而且這個題目出的也不算難

所以這個題目還是相對簡單些的,,,,,,。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章