【发布时间】:2020-03-26 16:50:59
【问题描述】:
我正在使用名为 SMT 求解器的 Z3 在某些约束下从给定向量生成一组新的随机数。我这样做是为了隐藏我的输入流。对应的代码如下:
from z3 import *
import sys
import io
import math
X0 = Real('X0')
X1 = Real('X1')
X2 = Real('X2')
X3 = Real('X3')
X4 = Real('X4')
X5 = Real('X5')
X6 = Real('X6')
X7 = Real('X7')
X8 = Real('X8')
X9 = Real('X9')
X10 = Real('X10')
X11 = Real('X11')
X12 = Real('X12')
X13 = Real('X13')
X14 = Real('X14')
DistinctParameter = [Distinct(X0 , X1 , X2 , X3 , X4 , X5 , X6 , X7 , X8 , X9 , X10 , X11 , X12 , X13 , X14 )]
maxPossibleValue = max(InputStream)
AggregateValue = 0
for x in InputStream:
AggregateValue = AggregateValue + float(x)
S_Con_Comparison1 = [(X0 < maxPossibleValue)]
S_Con_Comparison2 = [(X1 < maxPossibleValue)]
S_Con_Comparison3 = [(X2 < maxPossibleValue)]
S_Con_Comparison4 = [(X3 < maxPossibleValue)]
S_Con_Comparison5 = [(X4 < maxPossibleValue)]
S_Con_Comparison6 = [(X5 < maxPossibleValue)]
S_Con_Comparison7 = [(X6 < maxPossibleValue)]
S_Con_Comparison8 = [(X7 < maxPossibleValue)]
S_Con_Comparison9 = [(X8 < maxPossibleValue)]
S_Con_Comparison10 = [(X9 < maxPossibleValue)]
S_Con_Comparison11 = [(X10 < maxPossibleValue)]
S_Con_Comparison12 = [(X11 < maxPossibleValue)]
S_Con_Comparison13 = [(X12 < maxPossibleValue)]
S_Con_Comparison14 = [(X13 < maxPossibleValue)]
S_Con_Comparison15 = [(X14 < maxPossibleValue)]
S_Con_Comparison = S_Con_Comparison1 + S_Con_Comparison2 + S_Con_Comparison3 + S_Con_Comparison4 + S_Con_Comparison5 + S_Con_Comparison6 + S_Con_Comparison7 + S_Con_Comparison8 + S_Con_Comparison9 + S_Con_Comparison10 + S_Con_Comparison11 + S_Con_Comparison12 + S_Con_Comparison13 + S_Con_Comparison14 + S_Con_Comparison15
S_Con = [( X0 + X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10 + X11 + X12 + X13 + X14 == AggregateValue)]
Solve = S_Con + S_Con_Comparison + DistinctParameter
s = Solver()
s.add(Solve)
x = Reals('x')
i = 0
output =[0] * len(InputStream)
if s.check() == sat:
m = s.model()
for d in m.decls():
location = int((repr(d).replace("X","")))
x=round(float(m[d].numerator_as_long())/float(m[d].denominator_as_long()),5)
output[location]= x
print(output)
输入流的每个值都可以取自一组可能的大小为 2^25 的值。根据我的理解,找到输入流的唯一方法是对结果流进行暴力破解。鉴于这种情况,我想知道是否可以从相应的输出流中对输入流进行逆向工程。
【问题讨论】:
-
请发布您的代码的简化版本(可能只有几个值?)以及人们可以自己运行的东西。以上不是一个独立的程序。有关如何发布到堆栈溢出的指南,请参见此处:stackoverflow.com/help/minimal-reproducible-example
-
要考虑的事情是:是什么让您认为输入流是由您的约束唯一确定的?我在你的描述中看不到任何可以保证的东西。因此,虽然您会找到一个输入流,但它可能不是唯一确定的。您确实必须更具体地说明您要在这里实现的目标。
-
我不会依赖 SMT 求解器来生成任何东西,即使是远程随机,因为它们往往具有相当的确定性。SMT 求解器的随机性通常仅限于老式的伪随机生成器,通常每次都使用相同的种子进行初始化,以便更容易重现实际的错误。
-
您的输入流总是大于或等于零吗?输出流包含负值是否可以接受?攻击者可以摆弄你的 python 脚本吗?
float -> Real -> float段落将引入微小但不可避免的错误。这些对于您的应用程序是否可以接受? -
您可能应该编辑您的问题以包含您在 cmets 中输入的信息(这些信息可能随时被 S.O. 删除),并以您在 cmets 中所做的相同方式澄清问题。
标签: reverse-engineering z3 smt z3py