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