forked from sp/lub2022-practical
				
			
				 6 changed files with 273 additions and 0 deletions
			
			
		- 
					37farm_animals/bare.py
 - 
					59farm_animals/final.py
 - 
					45farm_animals/version1.py
 - 
					48farm_animals/version2.py
 - 
					46password_cracking/password_cracker.py
 - 
					38password_cracking/password_storage.sh
 
@ -0,0 +1,37 @@ | 
				
			|||
# coding: utf-8 | 
				
			|||
import os, sys | 
				
			|||
from z3 import * | 
				
			|||
 | 
				
			|||
# No need to parse anything for this example | 
				
			|||
 | 
				
			|||
#################################### Farm Animals #################################### | 
				
			|||
solver = Solver() | 
				
			|||
 | 
				
			|||
# We have 100€ ( == 10000c) and we want to buy **exactly** 100 animals, where | 
				
			|||
# price(cow) = 10€ | 
				
			|||
# price(chicken) = 3€ | 
				
			|||
# price(mouse) = 25c | 
				
			|||
 | 
				
			|||
# todo | 
				
			|||
# Create Z3 variables which hold the number of animals and the price respectively | 
				
			|||
 | 
				
			|||
# todo | 
				
			|||
# Create Z3 variables which hold the amount of the different animals our farmes is going to buy | 
				
			|||
 | 
				
			|||
# todo | 
				
			|||
# Add constraints which model our real life requirements | 
				
			|||
 | 
				
			|||
# Check for satisfiability | 
				
			|||
res = solver.check() | 
				
			|||
if res != sat: | 
				
			|||
    print("unsat") | 
				
			|||
    sys.exit(1) | 
				
			|||
 | 
				
			|||
################################################################################ | 
				
			|||
# print the model | 
				
			|||
#  get the model | 
				
			|||
m = solver.model() | 
				
			|||
#  print all Z3 variables which have an assignment in the model | 
				
			|||
for d in m.decls(): | 
				
			|||
    print("%s = %s" % (d.name(), m[d])) | 
				
			|||
################################################################################ | 
				
			|||
@ -0,0 +1,59 @@ | 
				
			|||
# coding: utf-8 | 
				
			|||
import os, sys | 
				
			|||
from z3 import * | 
				
			|||
 | 
				
			|||
# No need to parse anything for this example | 
				
			|||
 | 
				
			|||
#################################### Farm Animals #################################### | 
				
			|||
solver = Solver() | 
				
			|||
 | 
				
			|||
# todo | 
				
			|||
# Create Z3 variables which hold the number of animals and the price respectively | 
				
			|||
amount_of_animals = Int("amount_of_animals") | 
				
			|||
total_price = Int("total_price") | 
				
			|||
target_price = 10000 | 
				
			|||
target_amount = 100 | 
				
			|||
 | 
				
			|||
# todo | 
				
			|||
# Create Z3 variables which hold the amount of the different animals our farmes is going to buy | 
				
			|||
cows = Int("cows") | 
				
			|||
mice = Int("mice") | 
				
			|||
chicken = Int("chicken") | 
				
			|||
 | 
				
			|||
# todo | 
				
			|||
# Add constraints which model our real life requirements | 
				
			|||
solver.add(cows + chicken + mice == amount_of_animals) | 
				
			|||
solver.add(cows * 1000 + chicken * 300 + mice * 25 == total_price) | 
				
			|||
solver.add(total_price == target_price) | 
				
			|||
solver.add(amount_of_animals == target_amount) | 
				
			|||
# Done? | 
				
			|||
 | 
				
			|||
solver.add(cows > 1) | 
				
			|||
solver.add(chicken > 1) | 
				
			|||
solver.add(mice > 1) | 
				
			|||
 | 
				
			|||
print(solver.sexpr()) | 
				
			|||
 | 
				
			|||
# Check for satisfiability | 
				
			|||
res = solver.check() | 
				
			|||
if res != sat: | 
				
			|||
    print("unsat") | 
				
			|||
    sys.exit(1) | 
				
			|||
 | 
				
			|||
################################################################################ | 
				
			|||
# print the model | 
				
			|||
#  get the model | 
				
			|||
m = solver.model() | 
				
			|||
#  print all Z3 variables which have an assignment in the model | 
				
			|||
result =  str(m[cows]) + " cows and " | 
				
			|||
result += str(m[chicken]) + " chicken and " | 
				
			|||
result += str(m[mice]) + " mice -> " | 
				
			|||
print(result) | 
				
			|||
print(m[cows].as_long() * 10 + m[chicken].as_long() * 3 + m[mice].as_long() * 0.25) | 
				
			|||
solver.add(mice != m[mice]) | 
				
			|||
res = solver.check() | 
				
			|||
if res != sat: | 
				
			|||
    print("unsat") | 
				
			|||
    sys.exit(1) | 
				
			|||
 | 
				
			|||
################################################################################ | 
				
			|||
@ -0,0 +1,45 @@ | 
				
			|||
# coding: utf-8 | 
				
			|||
import os, sys | 
				
			|||
from z3 import * | 
				
			|||
 | 
				
			|||
# No need to parse anything for this example | 
				
			|||
 | 
				
			|||
#################################### Farm Animals #################################### | 
				
			|||
solver = Solver() | 
				
			|||
 | 
				
			|||
# todo | 
				
			|||
# Create Z3 variables which hold the number of animals and the price respectively | 
				
			|||
amount_of_animals = Int("amount_of_animals") | 
				
			|||
total_price = Int("total_price") | 
				
			|||
target_price = 10000 | 
				
			|||
target_amount = 100 | 
				
			|||
 | 
				
			|||
# todo | 
				
			|||
# Create Z3 variables which hold the amount of the different animals our farmes is going to buy | 
				
			|||
cows = Int("cows") | 
				
			|||
mice = Int("mice") | 
				
			|||
chicken = Int("chicken") | 
				
			|||
 | 
				
			|||
# todo | 
				
			|||
# Add constraints which model our real life requirements | 
				
			|||
solver.add(cows + chicken + mice == amount_of_animals) | 
				
			|||
solver.add(cows * 1000 + chicken * 300 + mice * 25 == total_price) | 
				
			|||
solver.add(total_price == target_price) | 
				
			|||
solver.add(amount_of_animals == target_amount) | 
				
			|||
 | 
				
			|||
# Done? | 
				
			|||
 | 
				
			|||
# Check for satisfiability | 
				
			|||
res = solver.check() | 
				
			|||
if res != sat: | 
				
			|||
    print("unsat") | 
				
			|||
    sys.exit(1) | 
				
			|||
 | 
				
			|||
################################################################################ | 
				
			|||
# print the model | 
				
			|||
#  get the model | 
				
			|||
m = solver.model() | 
				
			|||
#  print all Z3 variables which have an assignment in the model | 
				
			|||
for d in m.decls(): | 
				
			|||
    print("%s = %s" % (d.name(), m[d])) | 
				
			|||
################################################################################ | 
				
			|||
@ -0,0 +1,48 @@ | 
				
			|||
# coding: utf-8 | 
				
			|||
import os, sys | 
				
			|||
from z3 import * | 
				
			|||
 | 
				
			|||
# No need to parse anything for this example | 
				
			|||
 | 
				
			|||
#################################### Farm Animals #################################### | 
				
			|||
solver = Solver() | 
				
			|||
 | 
				
			|||
# todo | 
				
			|||
# Create Z3 variables which hold the number of animals and the price respectively | 
				
			|||
amount_of_animals = Int("amount_of_animals") | 
				
			|||
total_price = Int("total_price") | 
				
			|||
target_price = 10000 | 
				
			|||
target_amount = 100 | 
				
			|||
 | 
				
			|||
# todo | 
				
			|||
# Create Z3 variables which hold the amount of the different animals our farmes is going to buy | 
				
			|||
cows = Int("cows") | 
				
			|||
mice = Int("mice") | 
				
			|||
chicken = Int("chicken") | 
				
			|||
 | 
				
			|||
# todo | 
				
			|||
# Add constraints which model our real life requirements | 
				
			|||
solver.add(cows + chicken + mice == amount_of_animals) | 
				
			|||
solver.add(cows * 1000 + chicken * 300 + mice * 25 == total_price) | 
				
			|||
solver.add(total_price == target_price) | 
				
			|||
solver.add(amount_of_animals == target_amount) | 
				
			|||
# Done? | 
				
			|||
 | 
				
			|||
solver.add(cows > 1) | 
				
			|||
solver.add(chicken > 1) | 
				
			|||
solver.add(mice > 1) | 
				
			|||
 | 
				
			|||
# Check for satisfiability | 
				
			|||
res = solver.check() | 
				
			|||
if res != sat: | 
				
			|||
    print("unsat") | 
				
			|||
    sys.exit(1) | 
				
			|||
 | 
				
			|||
################################################################################ | 
				
			|||
# print the model | 
				
			|||
#  get the model | 
				
			|||
m = solver.model() | 
				
			|||
#  print all Z3 variables which have an assignment in the model | 
				
			|||
for d in m.decls(): | 
				
			|||
    print("%s = %s" % (d.name(), m[d])) | 
				
			|||
################################################################################ | 
				
			|||
@ -0,0 +1,46 @@ | 
				
			|||
# coding: utf-8 | 
				
			|||
import os, sys | 
				
			|||
from z3 import * | 
				
			|||
 | 
				
			|||
 | 
				
			|||
# 'hashed' password we have from the 'binary' | 
				
			|||
hashed_password=168372036536695091 | 
				
			|||
 | 
				
			|||
# we are going to try different lengths of passwords | 
				
			|||
for password_length in range(5,15): | 
				
			|||
    # init solver, this will wipe any residual constraints in each loop | 
				
			|||
    solver = Solver() | 
				
			|||
 | 
				
			|||
    # initialize constraints for each character of the password | 
				
			|||
    # we are only going to allow ascii values from 'a' to 'z' | 
				
			|||
    chars = [Int(c) for c in range(password_length)] | 
				
			|||
 | 
				
			|||
    # initialization value | 
				
			|||
    n = 7 | 
				
			|||
    # the 'hashing' algorithm we have extracted from the binary | 
				
			|||
    for c in chars: | 
				
			|||
        # this essentially extends the symbolic constraints associated with each 'c' | 
				
			|||
        n = n * 27 + c * 5 | 
				
			|||
 | 
				
			|||
    # the solver should return sat iff | 
				
			|||
    # the hashed input is equal the hashed_password | 
				
			|||
    solver.add(n == hashed_password) | 
				
			|||
 | 
				
			|||
    for c in chars: | 
				
			|||
        # each 'c' should be a lowercase ascii character | 
				
			|||
        solver.add(And(c >= ord('a'), | 
				
			|||
                       c <= ord('z'))) | 
				
			|||
 | 
				
			|||
 | 
				
			|||
    res = solver.check() | 
				
			|||
    if res != sat: | 
				
			|||
        print("No possible password found...") | 
				
			|||
        continue | 
				
			|||
 | 
				
			|||
    # print the model/password found | 
				
			|||
    m = solver.model() | 
				
			|||
    for d in m.decls(): | 
				
			|||
        print("%s = %s -> %c" % (d.name(), m[d], chr(m[d].as_long()))) | 
				
			|||
    password = ''.join(chr(m[c].as_long()) for c in chars) | 
				
			|||
    print("Trying '" + password + "' as password") | 
				
			|||
    os.system("./password_storage.sh {}".format(password)) | 
				
			|||
@ -0,0 +1,38 @@ | 
				
			|||
#!/usr/bin/env bash | 
				
			|||
 | 
				
			|||
 | 
				
			|||
# return password to password storage shell | 
				
			|||
get_password() { | 
				
			|||
  printf 'secret' | 
				
			|||
} | 
				
			|||
 | 
				
			|||
# initialization value | 
				
			|||
n=7 | 
				
			|||
# 'hashed' password | 
				
			|||
hashed_password=168372036536695091 | 
				
			|||
 | 
				
			|||
# read password as parameter ... | 
				
			|||
password=$1 | 
				
			|||
# ... or ask for password | 
				
			|||
[ -z $1 ] && printf "Enter password:\n" && read -s password | 
				
			|||
 | 
				
			|||
# 'hash' the password with some random multiplications | 
				
			|||
for (( i=0; i<${#password}; i++ )); do | 
				
			|||
  charval=$(printf "%d\n" \'${password:$i:1}) # ascii value of the current character | 
				
			|||
  n=$(echo "$n * 27 + $charval * 5" | bc) # do some computations and assign to intermediate result | 
				
			|||
done | 
				
			|||
 | 
				
			|||
# check if hash of entered password is equal to 'hashed' password | 
				
			|||
if [[ $n -eq $hashed_password ]]; then | 
				
			|||
  # if yes then grant access to prompt | 
				
			|||
  while true; do | 
				
			|||
    printf "\n$(whoami)'s password storage> " | 
				
			|||
    read pass | 
				
			|||
    get_password | 
				
			|||
  done | 
				
			|||
  exit 0 | 
				
			|||
else | 
				
			|||
  # else exit with error code | 
				
			|||
  printf "\nWrong password." | 
				
			|||
  exit 1 | 
				
			|||
fi | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue