Have You Looked Hard Enough ?
Pour ce challenge, on télécharge un fihcier challenge.pdf, qui contient du texte.
Exiftool
Lorsque l’on utilise exiftool sur ce fichier, on peut y voir :
└─[$] <> exiftool challenge.pdf
ExifTool Version Number : 13.04
File Name : challenge.pdf
[...]
Keywords : ZGVmIF9fX19fXyhjY2NjY2NjY2NjKToKICAgIHJldHVybiBieXRlcy5mcm9taGV4KGNjY2NjY2NjY2MpCmRlZiBfX19fXyhiYmJiYmJiYmIsIGJiYmJiYmJiYmIpOgogICAgYmJiYmJiYmJiYmIgPSBieXRlYXJyYXkoYmJiYmJiYmJiLCAndXRmLTgnKQogICAgZm9yIGJiYmJiYmJiIGluIHJhbmdlKGxlbihiYmJiYmJiYmJiYikpOgogICAgICAgIGJiYmJiYmJiYmJiW2JiYmJiYmJiXSBePSBiYmJiYmJiYmJiW2JiYmJiYmJiICUgbGVuKGJiYmJiYmJiYmIpXQogICAgcmV0dXJuIGJ5dGVzKGJiYmJiYmJiYmJiKQpkZWYgX19fX19fXyhhYWFhYWEpOgogICAgYWFhYWEgPSBiIiIKICAgIGZvciBpIGluIHJhbmdlKGxlbihhYWFhYWEpKToKICAgICAgICBhYWFhYSArPSBpbnQudG9fYnl0ZXMoYWFhYWFhW2ldICsgaSkKICAgIHJldHVybiBhYWFhYQpkZWYgX19fX19fX18oaGhoaGhoaGhoaGgsIGhoaGhoaGhoKToKICAgIGdnZ2dnZ2dnZ2cgPSBieXRlYXJyYXkoaGhoaGhoaGhoaGgpCiAgICBmb3IgaSBpbiByYW5nZShsZW4oZ2dnZ2dnZ2dnZykpOgogICAgICAgIGdnZ2dnZ2dnZ2dbaV0gXj0gaGhoaGhoaGhbaSAlIGxlbihoaGhoaGhoaCldCiAgICByZXR1cm4gYnl0ZXMoZ2dnZ2dnZ2dnZykKdHJ5OgojICAgIGlpaWlpaWlpID0gYnl0ZXMuZnJvbWhleChpbnB1dChieXRlcy5mcm9taGV4KCI0NzY5NzY2NTIwNmQ2NTIwNzQ2ODY1MjA3MDYxNzM3Mzc3NmY3MjY0M2EyMCIpLmRlY29kZSgpKSkKICAgIGlmIG5vdCBpaWlpaWlpaToKIyAgICAgICAgcHJpbnQoYnl0ZXMuZnJvbWhleCgiNDg2ZDZkMmMyMDc5NmY3NTIwNjM2MTZlNmU2Zjc0MjA2NzY5NzY2NTIwNmQ2NTIwNjE2ZTIwNjU2ZDcwNzQ3OTIwNzA2MTczNzM3NzZmNzI2NDJlMmUyZSIpLmRlY29kZSgpKQogICAgICAgIGV4aXQoMSkKICAgIGRkZGRkZGQgPSAiNDE0YzUxNDY3NzRiNWU1ZjU3MmE2MzU3NTk1NzM2MjQ1NDRlNTgyMTYyNGMwZTRjNWExODU2MWM2MSIKICAgIGtrayA9IF9fX19fXyhkZGRkZGRkKQogICAgZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlID0gX19fX19fXyhpaWlpaWlpaSkKICAgIGZmZmZmZmZmZmZmZmZmZmZmZmYgPSBfX19fX19fXyhlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWUsIGtraykKICAgIGpqampqampqampqamogPSBmZmZmZmZmZmZmZmZmZmZmZmZmLmRlY29kZSgndXRmLTgnKQojICAgIHByaW50KGJ5dGVzLmZyb21oZXgoIjU3NjU2YzZjMjA2NDZmNmU2NTIxMmMyMDc5NmY3NTIwNjM2MTZlMjA3NjYxNmM2OTY0NjE3NDY1MjA3NzY5NzQ2ODIwNzQ2ODY5NzMyMDY2NmM2MTY3M2EiKS5kZWNvZGUoKSwgampqampqampqampqaikKZXhjZXB0IEV4Y2VwdGlvbiBhcyBfOgogICAgZXhpdCgxKQo=
Décodage base64
On a donc une belle base64
└─[$] <> echo "ZGVmIF9fX19fXyhjY2NjY2NjY2NjKToKICAgIHJldHVybiBieXRlcy5mcm9taGV4KGNjY2NjY2NjY2MpCmRlZiBfX19fXyhiYmJiYmJiYmIsIGJiYmJiYmJiYmIpOgogICAgYmJiYmJiYmJiYmIgPSBieXRlYXJyYXkoYmJiYmJiYmJiLCAndXRmLTgnKQogICAgZm9yIGJiYmJiYmJiIGluIHJhbmdlKGxlbihiYmJiYmJiYmJiYikpOgogICAgICAgIGJiYmJiYmJiYmJiW2JiYmJiYmJiXSBePSBiYmJiYmJiYmJiW2JiYmJiYmJiICUgbGVuKGJiYmJiYmJiYmIpXQogICAgcmV0dXJuIGJ5dGVzKGJiYmJiYmJiYmJiKQpkZWYgX19fX19fXyhhYWFhYWEpOgogICAgYWFhYWEgPSBiIiIKICAgIGZvciBpIGluIHJhbmdlKGxlbihhYWFhYWEpKToKICAgICAgICBhYWFhYSArPSBpbnQudG9fYnl0ZXMoYWFhYWFhW2ldICsgaSkKICAgIHJldHVybiBhYWFhYQpkZWYgX19fX19fX18oaGhoaGhoaGhoaGgsIGhoaGhoaGhoKToKICAgIGdnZ2dnZ2dnZ2cgPSBieXRlYXJyYXkoaGhoaGhoaGhoaGgpCiAgICBmb3IgaSBpbiByYW5nZShsZW4oZ2dnZ2dnZ2dnZykpOgogICAgICAgIGdnZ2dnZ2dnZ2dbaV0gXj0gaGhoaGhoaGhbaSAlIGxlbihoaGhoaGhoaCldCiAgICByZXR1cm4gYnl0ZXMoZ2dnZ2dnZ2dnZykKdHJ5OgojICAgIGlpaWlpaWlpID0gYnl0ZXMuZnJvbWhleChpbnB1dChieXRlcy5mcm9taGV4KCI0NzY5NzY2NTIwNmQ2NTIwNzQ2ODY1MjA3MDYxNzM3Mzc3NmY3MjY0M2EyMCIpLmRlY29kZSgpKSkKICAgIGlmIG5vdCBpaWlpaWlpaToKIyAgICAgICAgcHJpbnQoYnl0ZXMuZnJvbWhleCgiNDg2ZDZkMmMyMDc5NmY3NTIwNjM2MTZlNmU2Zjc0MjA2NzY5NzY2NTIwNmQ2NTIwNjE2ZTIwNjU2ZDcwNzQ3OTIwNzA2MTczNzM3NzZmNzI2NDJlMmUyZSIpLmRlY29kZSgpKQogICAgICAgIGV4aXQoMSkKICAgIGRkZGRkZGQgPSAiNDE0YzUxNDY3NzRiNWU1ZjU3MmE2MzU3NTk1NzM2MjQ1NDRlNTgyMTYyNGMwZTRjNWExODU2MWM2MSIKICAgIGtrayA9IF9fX19fXyhkZGRkZGRkKQogICAgZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlID0gX19fX19fXyhpaWlpaWlpaSkKICAgIGZmZmZmZmZmZmZmZmZmZmZmZmYgPSBfX19fX19fXyhlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWUsIGtraykKICAgIGpqampqampqampqamogPSBmZmZmZmZmZmZmZmZmZmZmZmZmLmRlY29kZSgndXRmLTgnKQojICAgIHByaW50KGJ5dGVzLmZyb21oZXgoIjU3NjU2YzZjMjA2NDZmNmU2NTIxMmMyMDc5NmY3NTIwNjM2MTZlMjA3NjYxNmM2OTY0NjE3NDY1MjA3NzY5NzQ2ODIwNzQ2ODY5NzMyMDY2NmM2MTY3M2EiKS5kZWNvZGUoKSwgampqampqampqampqaikKZXhjZXB0IEV4Y2VwdGlvbiBhcyBfOgogICAgZXhpdCgxKQo" | base64 -d
def ______(cccccccccc):
return bytes.fromhex(cccccccccc)
def _____(bbbbbbbbb, bbbbbbbbbb):
bbbbbbbbbbb = bytearray(bbbbbbbbb, 'utf-8')
for bbbbbbbb in range(len(bbbbbbbbbbb)):
bbbbbbbbbbb[bbbbbbbb] ^= bbbbbbbbbb[bbbbbbbb % len(bbbbbbbbbb)]
return bytes(bbbbbbbbbbb)
def _______(aaaaaa):
aaaaa = b""
for i in range(len(aaaaaa)):
aaaaa += int.to_bytes(aaaaaa[i] + i)
return aaaaa
def ________(hhhhhhhhhhh, hhhhhhhh):
gggggggggg = bytearray(hhhhhhhhhhh)
for i in range(len(gggggggggg)):
gggggggggg[i] ^= hhhhhhhh[i % len(hhhhhhhh)]
return bytes(gggggggggg)
try:
# iiiiiiii = bytes.fromhex(input(bytes.fromhex("47697665206d65207468652070617373776f72643a20").decode()))
if not iiiiiiii:
# print(bytes.fromhex("486d6d2c20796f752063616e6e6f742067697665206d6520616e20656d7074792070617373776f72642e2e2e").decode())
exit(1)
ddddddd = "414c5146774b5e5f572a635759573624544e5821624c0e4c5a18561c61"
kkk = ______(ddddddd)
eeeeeeeeeeeeeeeeeeeeeeee = _______(iiiiiiii)
fffffffffffffffffff = ________(eeeeeeeeeeeeeeeeeeeeeeee, kkk)
jjjjjjjjjjjjj = fffffffffffffffffff.decode('utf-8')
# print(bytes.fromhex("57656c6c20646f6e65212c20796f752063616e2076616c69646174652077697468207468697320666c61673a").decode(), jjjjjjjjjjjjj)
except Exception as _:
exit(1)
Python
Et maintenant un beau code Python!
Le code sans les commentaires et avec les bons tab, ainsi que les strings visibiles:
def decode_from_hex(string):
return bytes.fromhex(string)
def increment_index_position(hex_input):
result = b""
for i in range(len(hex_input)):
result += int.to_bytes(hex_input[i] + i)
return result
def transformations(a, b):
arr = bytearray(a)
for i in range(len(arr)):
arr[i] ^= b[i % len(b)]
return bytes(arr)
try:
hex_input = bytes.fromhex(input('Give me the password: '))
if not hex_input:
print('Hmm, you cannot give me an empty password...')
exit(1)
xor = "414c5146774b5e5f572a635759573624544e5821624c0e4c5a18561c61"
decoded_xor = decode_from_hex(xor)
incremented_index = increment_index_position(hex_input)
transformed_pass_inc = transformations(incremented_index, decoded_xor)
result = transformed_pass_inc.decode('utf-8')
print('Well done!, you can validate with this flag:', result)
except Exception as _:
exit(1)
On sait que la fonction va donner un flag valide de la forme AMSI{...}, il ne reste plus qu’à faire matcher les premiers caractères.
Pour trouver AMSI, ce n’est pas bien dure, voici un script Python:
xor = bytes.fromhex("414c5146774b5e5f572a635759573624544e5821624c0e4c5a18561c61")
wanted = "AMSI{"
result = bytearray(wanted, 'utf-8')
for i in range(0, len(wanted)):
result[i] = (xor[i] ^ result[i]) - i
print(result)
On peut voir en sorti: \x00\x00\x00\x0c\x08, ce qui correspond bel et bien à AMSI{.
Maintenant, il faut déterminer comment chopper le flag.
Après avoir rouvert le pdf, je me suis rendu compte qu’en faisant control + A, on pouvait voir du texte caché qui débutait par “0000000c08”. (Enfin, il fallait copier coller le texte ailleurs car il était de couleur blanc sur blanc).
0000000c081634320010042a30266408200020020018141810100c1000
De fait, après l’avoir passé dans le programme, j’ai obtenu le flag AMSI{Pdf_3mbedD3d_j4va$cr1p7}.