Question: Step 1 : finding our sinks: memcpy _ refs = [ ( ref . function, ref.address ) for ref in bv . get _ code
Step : finding our sinks:
memcpyrefs
reffunction, ref.address
for ref in bvgetcoderefsbvsymbolsmemcpy'address
dangerouscalls
for function, addr in memcpyrefs:
callinstr function.getlowlevelilataddrmediumlevelil
if checkmemcpycallinstr.ssaform:
dangerouscalls.appendaddr callinstr.address
Step : Eliminate sinks that we know arent vulnerable
def checkmemcpymemcpycall:
sizeparam memcpycall.params
if sizeparam.operation MediumLevelILOperation.MLILVARSSA:
return False
possiblesizes sizeparam.possiblevalues
# Dataflow won't combine multiple possible values from
# shifted bytes, so any value we care about will be
# undetermined at this point. This might change in the future?
if possiblesizes.type RegisterValueType.UndeterminedValue:
return False
model ByteSwapModelersizeparam, bvaddresssize
return model.isbyteswap
Step : check variables the size depends on:
vardef self.function.getssavardefinitionselfvar.src
# Visit statements that our variable directly depends on
self.tovisit.appendvardef
while self.tovisit:
idx self.tovisit.pop
if idx is not None:
self.visitselffunctionidx
Step : Identify variables that might be a part byte swap:
def visitMLILVARSSAself expr:
if expr.src not in self.visited:
vardef expr.function.getssavardefinitionexprsrc
if vardef is not None:
self.tovisit.appendvardef
src createBitVecexprsrc expr.size
valuerange identifybyteexpr self.function
if valuerange is not None:
self.solver.add
Or
src
Andsrc valuerange.step
self.bytevars.addexprsrc
return src
Step : Identify constraints on the size parameter:
for i branch in self.var.branchdependence.iteritems:
for vr in self.functionivarsread:
if vr in self.bytevars:
raise ModelIsConstrained
vrdef self.function.getssavardefinitionvr
if vrdef is None:
continue
for vrvr in self.functionvrdefvarsread:
if vrvr in self.bytevars:
raise ModelIsConstrained
Step : Solve the model:
self.solver.add
Not
And
var ZeroExt
var.size lenordering
Concatordering
reversevar ZeroExt
reversevar.size reversedordering.size
reversedordering
if self.solver.check unsat:
return True
Step by Step Solution
There are 3 Steps involved in it
1 Expert Approved Answer
Step: 1 Unlock
Question Has Been Solved by an Expert!
Get step-by-step solutions from verified subject matter experts
Step: 2 Unlock
Step: 3 Unlock
