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