Cóż, możesz rozważyć użycie Pythona lub innego języka skryptowego / programowania do takich rzeczy.
Zalety robienia tego programowo to:
- Ilekroć będziesz musiał powtórzyć coś podobnego, będziesz mieć gotowy kod.
- Możesz pisać komentarze, aby wyjaśnić, co się dzieje, więc jeśli kiedyś będziesz musiał zrozumieć, co zrobiłeś wcześniej, mam nadzieję, że kod i komentarze pozwolą ci to zrobić.
- Wiele rzeczy, takich jak kodowanie, obsługa bajtów itp., Jest łatwiejszych niż w konsoli
- Większość języków jest wieloplatformowa, więc łatwo będzie działać na systemach Windows, Linux i Android, jeśli raz przełączysz urządzenie.
Jeśli chodzi o twój problem, można go rozwiązać za pomocą Pythona, aby zrobić wszystko:
# we import the function we need from common librairies
from base64 import b64decode
from Crypto.Cipher import AES
from binascii import hexlify, unhexlify
# First we decode the message and the key from base64 into bytes:
msg = b64decode("8LBUVZfDfI6wnggG1uUYuQsRoGd08pGwHCN++R5rabMW9PJmWHWcSrjy5Tfffj6L")
key = b64decode("3q1FxGhuZ5fQYbjzDxgQ35==")
# We then instantiate a cipher_suite using AES with the provided key, in ECB mode
cipher_suite = AES.new(key, AES.MODE_ECB)
# We can decrypt the message using our cipher_suite:
recovered = cipher_suite.decrypt(msg)
# We can print it:
print ("plaintext: ", recovered)
# There is some garbage at the end, but if we display it in hexadecimal form:
print ("in hex:", hexlify(recovered))
# We can see it's just padding using '5f', so let's create a function to remove such padding:
def unpad(padded):
# we declare the value of our padding:
paddingByte = unhexlify('5f')
# we do a loop, while the last byte is padding
while padded[-1:]==paddingByte:
# we remove the last byte
padded = padded[:-1]
# once it's done, we return
return padded
# We can now use our function to remove padding:
print ("unpadded: ", unpad(recovered))
Teraz, jeśli nie chcesz nauczyć się języka Python lub innego języka i / lub naprawdę chcesz to wszystko zrobić w swoim terminalu, jest to również możliwe: wtedy możesz zrobić wszystko bezpośrednio za pomocą potoków, aby przesłać dane z jednego polecenie do drugiej, podstawienie polecenia , aby podać odpowiedni klucz do openssl, i polecenia base64
do obsługi base64 plus xxd
do konwersji danych binarnych na hex (dla klucza w openssl), a na koniec użyj sed
do usunięcia 5f
dopełnienia:
echo "8LBUVZfDfI6wnggG1uUYuQsRoGd08pGwHCN++R5rabMW9PJmWHWcSrjy5Tfffj6L" | base64 --decode | openssl enc -d -K $(echo "3q1FxGhuZ5fQYbjzDxgQ35==" | base64 --decode | xxd -c 16 -ps) -aes-128-ecb -nosalt -nopad | sed 's/_*$//g'
Nie wiem dlaczego, ale osobiście uważam, że podejście do Pythona jest czystsze.
Wspomniałeś również, że uzyskałeś śmieci w sposób wskazany przez Maarten Bodewes, wynika to z faktu, że podajesz wartości szesnastkowe do OpenSSL, podczas gdy powinieneś podać bezpośrednio dane binarne (nie wartość szesnastkową) dla wiadomości, podczas gdy ty powinien podać klucz w systemie szesnastkowym:
echo -n f0b0545597c37c8eb09e0806d6e518b90b11a06774f291b01c237ef91e6b69b316f4f26658759c4ab8f2e537df7e3e8b | xxd -r -p | openssl ...
PS: prawdopodobnie powinieneś unikać publikowania rzeczywistych wartości, które napotykasz w CTF, ponieważ może to zepsuć grę dla osób, których pierwszym odruchem jest wyszukanie wartości w Google.