最近太難了 好多比賽 打比賽 看題解啥的 都沒有時間寫博客了
然後 也在看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 應該是比較老的一款 而且這個題目出的也不算難
所以這個題目還是相對簡單些的,,,,,,。