Dans ce challenge on nous fournit un fichier de bytecode python
Je décompile le binaire afin d’obtenir un fichier python lisible
# Source Generated with Decompyle++
# File: le_stagiaire.pyc (Python 3.10)
def useless_encrypt(string):
bad_string = ''
looser()
exit(0)
def encrypt_string(string):
tmp_string = ''
looser()
def encrypt_string1(string):
tmp_string = ''
it = 1
tmp_string += chr(ord(letter) - 1)
it = 1
continue
return tmp_string
def tryme(string):
print(string)
if string == 'NBUE|sStd^ShhnMN~':
print('GG ! Use this password as flag')
return None
None()
def encrypt_string2(string):
tmp_string = ''
if tmp_string == 'MCTF{fake_flag}':
looser()
return None
None()
def looser():
print('Bad password, looser !')
def func1(string):
print(useless_encrypt(string))
def func2(string):
print(encrypt_string(string))
def func3(string):
tryme(encrypt_string1(string))
def func4(string):
print(encrypt_string2(string))
def main():
user_input = input('Please enter the password : ')
funcmap = {
1: func1,
2: func2,
3: func3,
4: func4 }
if len(user_input) == 12:
len(user_input)
funcmap[1](user_input)
return None
if len(user_input) == 15:
len(user_input)
funcmap[2](user_input)
return None
if len(user_input) == 17:
funcmap[3](user_input)
return None
if None == None:
funcmap[4](user_input)
return None
looser()
main()
On peut y voir une string encodé via un algorithme lorsqu’on utilise la fonction 3 on peut voir qu’il passe notre string à la fonction et qu’il appelle tryme afin de tester la validité de notre flag
Code de l’algorithme:
def encrypt_string1(string):
tmp_string = ''
it = 1
tmp_string += chr(ord(letter) - 1)
it = 1
continue
return tmp_string
bon ce n’est pas bien dur si on réfléchis trois seconde on sait qu’il y a une boucle qui itère sur chacun des caractères de la chaine et soustrait -1 à sa valeur en revanche si l’on test cela on remarque que cette action ne fonctionne que 1/ 2 je me suis donc dis que j’allais une fois sur 2 ajouter 2 à ma valeur. A la fin mon exploit ressemble à ceci
def decode(string)
string = string.split("")
flag = []
string.map.with_index do |value, i|
if i % 2 == 0
flag << (value.ord - 1).chr
else
flag << (value.ord + 1).chr
end
end
return flag.join
end
print(decode('NBUE|sStd^ShhnMN~'))
MCTF{tRuc_RigoLO}