逆向z3求解約束器
Z3求解約束器
一:基本資料型別:
在Python中使用Z3模組,我們的所求結果一般有以下幾種資料型別:
Int #整型
Bool #布林型
Array #陣列
BitVec('a',8) #char型
其中BitVec可以是特定大小的資料型別,不一定是8,例如C語言中的int型可以用BitVec('a',32)表示
設未知數的方法:
可以使用'Int','Real','BitVec'等宣告一個整數或實數變數,也可以申明一個變數陣列
例如:x = Int('x') #這個int不是c/c++中的那個,而僅僅只代表整數
y = Real('y') #**實數**變數(**數學中的**那個實數)
z = BitVec('z',8) #char型
w = BitVec('w',32) #int型
p = Bool('p') #定義布林型
初始化序列:
flag = []
for i in range(5):
flag.append(BitVec('%d' % i, 8)) #char型
print(flag)
結果為:[0, 1, 2, 3, 4]
flag = []
for i in range(5):
flag.append(BitVec('%d' % i, 32)) #int型
print(flag)
結果為:[0, 1, 2, 3, 4]
二:基本**:**
Solver()
Solver()命令會建立一個通用求解器,建立後我們可以新增我們的約束條件,進行下一步的求解
add()
add()命令用來新增約束條件,通常在solver()命令之後,新增的約束條件通常是一個邏輯等式
check()
該函式通常用來判斷在新增完約束條件後,來檢測解的情況,有解的時候會回顯sat,無解的時候會回顯unsat
model()
在存在解的時候,該函式會將每個限制條件所對應的解集的交集,進而得出正解。
常用求解四步驟:
建立約束求解器
solver = Solver()
新增約束條件(這一步是z3求解的關鍵)
olver.add()
判斷解是否存在
if solver.check()==sat:
求解
print solver.model()
三:z3的簡單使用
例一:
假設有方程組:
30x+15y=675
12x+5y=265
完整程式碼:
from z3 import *
x = Real('x')
y = Real('y') #設未知數
s = Solver() #建立約束求解器
s.add(30*x+15*y==675)
s.add(12*x+5*y==265) #新增約束條件
if s.check() == sat: #檢測是否有解
result = s.model()
print result #若有解則得出解,注意這裡的解是等式
else:
print 'no result' #無解則列印no result
例二:
>>> from z3 import *
>>> x = Int('x')
>>> y = Int('y')
>>> a = Real('a')
>>> b = Real('b')
>>> c = Real('c')
>>> d = Real('d') #設未知數
>>> s = Solver() #建立約束求解器
>>> s.add(a + b == 12) #在約束求解器下新增約束條件
>>> s.add(c - d == 9)
>>> s.add(a + c == 22)
>>> s.add(b + d == 12)
>>>
>>> print(s.check()) #檢測是否有解
sat
>>> print(s.model()) #列印出求解的結果
[b = 11/2, a = 13/2, d = 13/2, c = 31/2]
>>> p = Solver()
>>> p.add(x + y == 1567856551)
>>> p.add(x - y == 6535435)
>>> p.check()
sat
>>> p.model()
[x = 787195993, y = 780660558]
例三:
例題:一道題目的指令碼
#總共分成4個階段:初始化,建立約束求解器和增加約束條件(關鍵就在這裡),檢測是否有解,列印結果
from z3 import * #若匯入了模組但沒有使用則是這種灰色
arr1 = [0X7A,0XCF,0X8C,0X95,0X8E,0XA8,0X5F,0XC9,0X7A,0X91,0X88,0XA7,0X70,0XC0,0X7F,0X89,0X86,0X93,0X5F,0XCF,0X6E,0X86,
0X85,0XAD,0X88,0XD4,0XA0,0XA2,0X98,0XB3,0X79,0XC1,0X7E,0X7E,0X77,0X93]
arr2 = [0x10,0x08,0X08,0x0E,0X06,0X0B,0X5,0X17,0X05,0X0A,0X0C,0X17,0X0E,0X17,0X13,0X07,0X08,0X0A,0X04,0X0D,0X16,0X11,0X0B,
0X16,0X06,0X0E,0X02,0X0B,0X12,0X09,0X05,0X08,0X08,0X0A,0X10,0X0D]
arr3 = [8,1,7,1,1,0,4,8,1,2,3,9,3,8,6,6,4,8,3,5,7,8,8,7,0,9,0,2,3,4,2,3,2,5,4,0]
#學會了idapython將其提取出來,arr1對應v8,arr2對應v9,arr3對應unk_602080
temp = [BitVec('%d' % i, 8) for i in range(36)] #初始化序列
s = Solver() #建立約束求解器
for i in range(36):
s.add(temp[i] <127) #新增約束條件①
s.add(temp[i] >=32)
#接下來還原始碼
ptr = [0]*36
v7 = [0]*36 #最開始的兩個變換之後的陣列
one = [0]*36
two = [0]*36 #這兩個用來存放對應的兩個函式的結果
for i in range(36):
ptr[i] = temp[i] >> 4
v7[i] = temp[i] & 15
for i in range(6):
for j in range(6):
for k in range(6):
one[6*i+j] += ptr[6*i + k] * arr3[6*k+j]
for i in range(6):
for j in range(6):
two[6*i+j] = v7[6*i+j] + arr3[6*i+j]
#程式碼還原結束
for i in range(36): #新增約束條件②
s.add(one[i] == arr1[i])
s.add(two[i] == arr2[i])
flag = []
strflag = ''
if s.check() == sat: #檢測是否有解
result = s.model()
for i in temp: #因為最後得出的是等式,先遍歷temp,把temp的每個依次賦給i
flag.append(result[i]) #然後找到每個temp對應的解,附加到空列表的後面
print(flag)
else:
print('無解')
result = [104, 103, 97, 109, 101, 123, 49, 95, 116, 104, 105, 110, 107, 95, 77, 97, 116, 114, 49, 120, 95, 105, 115, 95, 118, 101, 114, 121, 95, 117, 115, 101, 102, 53, 108, 125]
for i in range(36):
strflag += chr(result[i])
print(strflag)
相關文章
- Z3求解約束器及例題
- 人工智慧包括約束求解器嗎?人工智慧
- 幾何約束求解思維框架框架
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- 約束
- Javaweb-約束-外來鍵約束JavaWeb
- 求解億級規模約束條件和變數,全球權威榜單斬獲第一,華為雲釋出首個商用AI求解器變數AI
- MySQL 約束MySql
- 03約束
- SQL約束SQL
- 約束CONSTRAINTAI
- 粒子群演算法求解帶約束最佳化問題 原始碼實現演算法原始碼
- (10)邏輯綜合新增約束(環境約束)
- 主鍵約束、唯一約束和唯一索引索引
- 蒙特卡洛模擬(3)————求解有約束的非線性規劃問題
- 差分約束
- 約束介紹
- 綜合約束
- PostgreSQLrotatetable自動清理排程-約束,觸發器SQL觸發器
- 帶約束條件的運籌規劃問題求解(模擬退火演算法實現)演算法
- Javaweb-約束案例JavaWeb
- IDELAY約束測試IDE
- MySQL 欄位約束MySql
- MySQL自增約束MySql
- 完整性約束
- 外來鍵約束
- SQLServer約束介紹SQLServer
- 《學習》6約束
- Python遺傳演算法工具箱的使用(一)求解帶約束的單目標優化Python演算法優化
- mysql資料庫約束MySql資料庫
- 約束定理+質數篩
- [20240228]約束novalidate.txt
- oracle 註釋和約束Oracle
- 資料庫常用約束資料庫
- Mysql入門【Mysql約束】MySql
- 泛型的約束理解泛型
- C#泛型約束C#泛型
- Eclipse中引入MyBatis約束EclipseMyBatis