Description
Decode it.
Description: A not so known decoding algorithm.
Hints: Do not trust symbols! they are lying. Check the algorithm.
Attachment: reversing50.zip
Resolution
Au début, on voit ce qui doit être un crackme, la particularité c’est qu’il est compilé pour fonctionner sur une architecture arm 32 bits.
ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0c1ab16b5f128e614308d2f8c1776d46080a6597, not stripped
En utilisant l’outil « string » nous voyons certains appels système intéressants :
memcmp malloc [...] MD5@@OPENSSL_1.0.0 [...] Base64decode_len
Memcmp ? Tiens donc. C’est plutôt utile pour comparer (entre autre) des chaines de caractère ça. md5 pour hasher et base64 pour encoder/décoder.
Jouons avec LD_PRELOAD pour hooker l’appel du memcmp :
#define _GNU_SOURCE #include <dlfcn.h> #include <string.h> #include <stdio.h> typedef int (*omemcmp)(const void *s1, const void *s2, size_t n); int memcmp(const void *s1, const void *s2, size_t n) { omemcmp omem; omem = (int)dlsym(RTLD_NEXT, "memcmp"); printf("s1:%s\ns2:%s\ns:%d\n", s1, s2, n); return omem(s1, s2, n); }
On le lance :
$ echo 'a' | LD_PRELOAD=./preload.so ./decoder Please, enter your encoded password: s1: s2:PASS_QIV1qyLR0hFEQU5KCbfm3Hok5V0VmpinCWseVd2X s:4 Access denied
Nous voyons ici qu’il faut que la chaine passée en argument ait la valeur « PASS_QIV1qyLR0hFEQU5KCbfm3Hok5V0VmpinCWseVd2X » une fois arrivée au point de comparaison. Mais passer cette chaine ne fonctionne pas.
Après une analyse plus poussée il s’est avéré qu’il faille envoyer cette même chaine de caractères, mais encodée en base64.
$ LD_PRELOAD=./preload.so ./decoder Please, enter your encoded password: UEFTU19RSVYxcXlMUjBpRkVRVTVLQ2JnbTNIb2s1VjBWbXBobkNXc2VWZDJY s1:PASS_QIV1qyLR0hFEQU5KCbfm3Hok5V0VmpinCWseVd2X s2:PASS_QIV1qyLR0hFEQU5KCbfm3Hok5V0VmpinCWseVd2X s:46 Great! the flag is EKO{4fa8c8eac431266a25f56a297a73c334}
Le flag est : EKO{4fa8c8eac431266a25f56a297a73c334}