Sekure Decrypt
9 minutos de lectura
Se nos proporciona un binario llamado dec
, el código fuente en C (src.c
) y un archivo core (core
):
$ file dec
dec: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=daf03fccbc32333244dc0f36e874e27457110af1, for GNU/Linux 3.2.0, with debug_info, not stripped
$ file core
core: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from './dec', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: './dec', platform: 'x86_64'
Análisis de código fuente
Como tenemos el código fuente, vamos a analizarlo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mcrypt.h>
#include <math.h>
#include <stdint.h>
#include <stdlib.h>
int encrypt(void* buffer, int buffer_len, char* IV, char* key, int key_len) {
MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL);
int blocksize = mcrypt_enc_get_block_size(td);
if( buffer_len % blocksize != 0 ) {
return 1;
}
mcrypt_generic_init(td, key, key_len, IV);
mcrypt_generic(td, buffer, buffer_len);
mcrypt_generic_deinit (td);
mcrypt_module_close(td);
return 0;
}
int decrypt(void* buffer, int buffer_len, char* IV, char* key, int key_len) {
MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL);
int blocksize = mcrypt_enc_get_block_size(td);
if( buffer_len % blocksize != 0 ){
return 1;
}
mcrypt_generic_init(td, key, key_len, IV);
mdecrypt_generic(td, buffer, buffer_len);
mcrypt_generic_deinit (td);
mcrypt_module_close(td);
return 0;
}
void* read_file(char* filename, int len) {
FILE *fp = fopen(filename, "rb");
void* data = malloc(len);
fread(data, 1, len, fp);
fclose(&fp);
return data;
}
int main(int argc, char* argv[]) // gcc src.c -o dec -lmcrypt -ggdb
{
char* IV = "AAAAAAAAAAAAAAAA";
char *key = getenv("KEY");
int keysize = 16;
char* buffer;
int buffer_len = 16;
void *ciphertext = read_file("flag.enc", buffer_len);
decrypt(ciphertext, buffer_len, IV, key, keysize);
printf("Decrypted contents: %s\n", ciphertext);
return 0;
}
Básicamente, utiliza un cifrado AES para descifrar un archivo llamado flag.enc
. Para construir el cifrado AES (en modo CBC), necesitamos encontrar la clave y el vector de inicialización (IV). Del código fuente, ya tenemos el IV (AAAAAAAAAAAAAAAA
), Pero la clave proviene de una variable de entorno llamada KEY
.
Si echamos un vistazo a la implementación de read_file
, encontramos un error en esta línea:
fclose(&fp);
El &
le dice al programa que ejecute fclose
en la dirección donde se almacena fp
, por lo que debería haberse escrito como fclose (fp);
. Obviamente, el programa se romperá debido a este error.
Analizando el archivo core
Este error debe ser la razón por la que nos dan un archivo core, porque estos archivos se generan cuando hay un error en el programa. El uso de archivos core es permitir que los desarrolladores analicen lo que sucedió y descubran dónde está el error.
Encontrando la clave de AES
En primer lugar, dado que las variables de entorno se cargan en la memoria cuando se inicia el programa, la clave de AES debe estar en las cadenas del archivo core. Podemos filtrar por KEY
, ya que este es el nombre de la variable de entorno:
$ strings core | grep KEY
KEY=
KEY=VXISlqY>Ve6D<{#F
Ahí la tenemos.
Encontrando el texto cifrado
Ahora necesitamos encontrar el texto cifrado. Ya sabemos que la longitud del texto cifrado es 16 debido a estas líneas del código:
int buffer_len = 16;
void *ciphertext = read_file("flag.enc", buffer_len);
Además, la cadena de texto cifrado se almacenará en el heap mediante malloc
:
void* read_file(char* filename, int len) {
FILE *fp = fopen(filename, "rb");
void* data = malloc(len);
fread(data, 1, len, fp);
fclose(&fp);
return data;
}
Vamos a ejecutar el binario dec
en GDB:
$ KEY='VXISlqY>Ve6D<{#F'
$ python3 -c 'print("B" * 16)' > flag.enc
$ gdb -q dec
Reading symbols from dec...
gef➤ run
Starting program: ./dec
Fatal error: glibc detected an invalid stdio handle
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=0x6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
El programa obviamente se rompe debido al error de programación. Sin embargo, veamos la ubicación del texto cifrado en la memoria:
gef➤ vmmap
[ Legend: Code | Heap | Stack ]
Start End Offset Perm Path
0x0000555555554000 0x0000555555555000 0x0000000000000000 r-- ./dec
0x0000555555555000 0x0000555555556000 0x0000000000001000 r-x ./dec
0x0000555555556000 0x0000555555557000 0x0000000000002000 r-- ./dec
0x0000555555557000 0x0000555555558000 0x0000000000002000 r-- ./dec
0x0000555555558000 0x0000555555559000 0x0000000000003000 rw- ./dec
0x0000555555559000 0x000055555557a000 0x0000000000000000 rw- [heap]
0x00007ffff7d95000 0x00007ffff7d98000 0x0000000000000000 rw-
0x00007ffff7d98000 0x00007ffff7dba000 0x0000000000000000 r-- /usr/lib/x86_64-linux-gnu/libc-2.31.so
0x00007ffff7dba000 0x00007ffff7f32000 0x0000000000022000 r-x /usr/lib/x86_64-linux-gnu/libc-2.31.so
0x00007ffff7f32000 0x00007ffff7f80000 0x000000000019a000 r-- /usr/lib/x86_64-linux-gnu/libc-2.31.so
0x00007ffff7f80000 0x00007ffff7f84000 0x00000000001e7000 r-- /usr/lib/x86_64-linux-gnu/libc-2.31.so
0x00007ffff7f84000 0x00007ffff7f86000 0x00000000001eb000 rw- /usr/lib/x86_64-linux-gnu/libc-2.31.so
0x00007ffff7f86000 0x00007ffff7f8a000 0x0000000000000000 rw-
0x00007ffff7f8a000 0x00007ffff7f90000 0x0000000000000000 r-- /usr/lib/libmcrypt.so.4.4.8
0x00007ffff7f90000 0x00007ffff7fa9000 0x0000000000006000 r-x /usr/lib/libmcrypt.so.4.4.8
0x00007ffff7fa9000 0x00007ffff7fb6000 0x000000000001f000 r-- /usr/lib/libmcrypt.so.4.4.8
0x00007ffff7fb6000 0x00007ffff7fb8000 0x000000000002b000 r-- /usr/lib/libmcrypt.so.4.4.8
0x00007ffff7fb8000 0x00007ffff7fba000 0x000000000002d000 rw- /usr/lib/libmcrypt.so.4.4.8
0x00007ffff7fba000 0x00007ffff7fc1000 0x0000000000000000 rw-
0x00007ffff7fcb000 0x00007ffff7fce000 0x0000000000000000 r-- [vvar]
0x00007ffff7fce000 0x00007ffff7fcf000 0x0000000000000000 r-x [vdso]
0x00007ffff7fcf000 0x00007ffff7fd0000 0x0000000000000000 r-- /usr/lib/x86_64-linux-gnu/ld-2.31.so
0x00007ffff7fd0000 0x00007ffff7ff3000 0x0000000000001000 r-x /usr/lib/x86_64-linux-gnu/ld-2.31.so
0x00007ffff7ff3000 0x00007ffff7ffb000 0x0000000000024000 r-- /usr/lib/x86_64-linux-gnu/ld-2.31.so
0x00007ffff7ffb000 0x00007ffff7ffc000 0x0000000000000000 rw-
0x00007ffff7ffc000 0x00007ffff7ffd000 0x000000000002c000 r-- /usr/lib/x86_64-linux-gnu/ld-2.31.so
0x00007ffff7ffd000 0x00007ffff7ffe000 0x000000000002d000 rw- /usr/lib/x86_64-linux-gnu/ld-2.31.so
0x00007ffff7ffe000 0x00007ffff7fff000 0x0000000000000000 rw-
0x00007ffffffde000 0x00007ffffffff000 0x0000000000000000 rw- [stack]
0xffffffffff600000 0xffffffffff601000 0x0000000000000000 --x [vsyscall]
gef➤ grep BBBBBBBBBBBBBBBB
[+] Searching 'BBBBBBBBBBBBBBBB' in memory
[+] In '[heap]'(0x555555559000-0x55555557a000), permission=rw-
0x555555559480 - 0x555555559490 → "BBBBBBBBBBBBBBBB"
0x5555555594a0 - 0x5555555594b2 → "BBBBBBBBBBBBBBBB\n"
gef➤ x/30gx 0x555555559440
0x555555559440: 0x0000000000000000 0x0000000000000000
0x555555559450: 0x0000000000000000 0x0000000000000000
0x555555559460: 0x0000000000000000 0x0000000000000000
0x555555559470: 0x00007ffff7f80f60 0x0000000000000021
0x555555559480: 0x4242424242424242 0x4242424242424242
0x555555559490: 0x0000000000000000 0x0000000000001011
0x5555555594a0: 0x4242424242424242 0x4242424242424242
0x5555555594b0: 0x000000000000000a 0x0000000000000000
0x5555555594c0: 0x0000000000000000 0x0000000000000000
0x5555555594d0: 0x0000000000000000 0x0000000000000000
0x5555555594e0: 0x0000000000000000 0x0000000000000000
0x5555555594f0: 0x0000000000000000 0x0000000000000000
0x555555559500: 0x0000000000000000 0x0000000000000000
0x555555559510: 0x0000000000000000 0x0000000000000000
0x555555559520: 0x0000000000000000 0x0000000000000000
Vemos que el heap es el espacio de memoria ubicado justo después del binario.
Podríamos intentar cargar el archivo binario y el archivo core en GDB de la siguiente manera, pero no se ejecuta correctamente debido a incongruencias con las versiones:
$ gdb -q dec -c core
Reading symbols from dec...
[New LWP 127492]
warning: .dynamic section for "/lib64/ld-linux-x86-64.so.2" is not at the expected address (wrong library or version mismatch?)
Core was generated by `./dec'.
Program terminated with signal SIGABRT, Aborted.
#0 0x00007fca32b0f3eb in strfromf (dest=0x7fff92e11530 "", size=0x7fff92e111e0, format=<optimized out>, f=<optimized out>) at strfrom-skeleton.c:111
111 strfrom-skeleton.c: No such file or directory.
gef➤ vmmap
[ Legend: Code | Heap | Stack ]
Start End Offset Perm Path
0x0000562e29888318 0x0000562e29888334 0x0000000000000318 rw- .interp
0x0000562e29888338 0x0000562e29888358 0x0000000000000338 rw- .note.gnu.property
0x0000562e29888358 0x0000562e2988837c 0x0000000000000358 rw- .note.gnu.build-id
0x0000562e2988837c 0x0000562e2988839c 0x000000000000037c rw- .note.ABI-tag
0x0000562e298883a0 0x0000562e298883c4 0x00000000000003a0 rw- .gnu.hash
0x0000562e298883c8 0x0000562e298885a8 0x00000000000003c8 rw- .dynsym
0x0000562e298885a8 0x0000562e29888702 0x00000000000005a8 rw- .dynstr
0x0000562e29888702 0x0000562e2988872a 0x0000000000000702 rw- .gnu.version
0x0000562e29888730 0x0000562e29888760 0x0000000000000730 rw- .gnu.version_r
0x0000562e29888760 0x0000562e29888820 0x0000000000000760 rw- .rela.dyn
0x0000562e29888820 0x0000562e29888970 0x0000000000000820 rw- .rela.plt
0x0000562e29889000 0x0000562e2988901b 0x0000000000001000 r-x .init
0x0000562e29889020 0x0000562e29889110 0x0000000000001020 r-x .plt
0x0000562e29889110 0x0000562e29889120 0x0000000000001110 r-x .plt.got
0x0000562e29889120 0x0000562e29889200 0x0000000000001120 r-x .plt.sec
0x0000562e29889200 0x0000562e298895d5 0x0000000000001200 r-x .text
0x0000562e298895d8 0x0000562e298895e5 0x00000000000015d8 r-x .fini
0x0000562e2988a000 0x0000562e2988a04e 0x0000000000002000 rw- .rodata
0x0000562e2988a050 0x0000562e2988a0ac 0x0000000000002050 rw- .eh_frame_hdr
0x0000562e2988a0b0 0x0000562e2988a218 0x00000000000020b0 rw- .eh_frame
0x0000562e2988bd40 0x0000562e2988bd48 0x0000000000002d40 -w- .init_array
0x0000562e2988bd48 0x0000562e2988bd50 0x0000000000002d48 -w- .fini_array
0x0000562e2988bd50 0x0000562e2988bf50 0x0000000000002d50 -w- .dynamic
0x0000562e2988bf50 0x0000562e2988c000 0x0000000000002f50 -w- .got
0x0000562e2988c000 0x0000562e2988c010 0x0000000000003000 -w- .data
0x0000562e2988c010 0x0000562e2988c018 0x0000000000003010 --- .bss
0x0000000000000000 0x000000000000002c 0x0000000000003010 r-- .comment
0x0000000000000000 0x0000000000000030 0x000000000000303c r-- .debug_aranges
0x0000000000000000 0x000000000000052e 0x000000000000306c r-- .debug_info
0x0000000000000000 0x0000000000000152 0x000000000000359a r-- .debug_abbrev
0x0000000000000000 0x00000000000001ab 0x00000000000036ec r-- .debug_line
0x0000000000000000 0x000000000000035c 0x0000000000003897 r-- .debug_str
0x0000000000000000 0x0000000000000e94 0x0000000000000708 r-- note0
0x0000000000000000 0x00000000000000d8 0x000000000000078c --- .reg/127492
0x0000000000000000 0x00000000000000d8 0x000000000000078c --- .reg
0x0000000000000000 0x0000000000000080 0x000000000000091c --- .note.linuxcore.siginfo/127492
0x0000000000000000 0x0000000000000080 0x000000000000091c --- .note.linuxcore.siginfo
0x0000000000000000 0x0000000000000140 0x00000000000009b0 --- .auxv
0x0000000000000000 0x000000000000052e 0x0000000000000b04 --- .note.linuxcore.file/127492
0x0000000000000000 0x000000000000052e 0x0000000000000b04 --- .note.linuxcore.file
0x0000000000000000 0x0000000000000200 0x0000000000001048 --- .reg2/127492
0x0000000000000000 0x0000000000000200 0x0000000000001048 --- .reg2
0x0000000000000000 0x0000000000000340 0x000000000000125c --- .reg-xstate/127492
0x0000000000000000 0x0000000000000340 0x000000000000125c --- .reg-xstate
0x0000562e29888000 0x0000562e29889000 0x0000000000002000 r-- load1
0x0000562e29889000 0x0000562e29889000 0x0000000000003000 r-x load2
0x0000562e2988a000 0x0000562e2988a000 0x0000000000003000 r-- load3
0x0000562e2988b000 0x0000562e2988c000 0x0000000000003000 r-- load4
0x0000562e2988c000 0x0000562e2988d000 0x0000000000004000 --- load5
0x0000562e2adce000 0x0000562e2adef000 0x0000000000005000 --- load6
0x00007fca32ac6000 0x00007fca32ac9000 0x0000000000026000 --- load7
0x00007fca32ac9000 0x00007fca32aca000 0x0000000000029000 r-- load8a
0x00007fca32aca000 0x00007fca32aca000 0x000000000002a000 r-- load8b
0x00007fca32aee000 0x00007fca32aee000 0x000000000002a000 r-x load9
0x00007fca32c66000 0x00007fca32c66000 0x000000000002a000 r-- load10
0x00007fca32cb0000 0x00007fca32cb3000 0x000000000002a000 r-- load11
0x00007fca32cb3000 0x00007fca32cb6000 0x000000000002d000 --- load12
0x00007fca32cb6000 0x00007fca32cba000 0x0000000000030000 --- load13
0x00007fca32cba000 0x00007fca32cbb000 0x0000000000034000 r-- load14a
0x00007fca32cbb000 0x00007fca32cbb000 0x0000000000035000 r-- load14b
0x00007fca32cc0000 0x00007fca32cc0000 0x0000000000035000 r-x load15
0x00007fca32cd9000 0x00007fca32cd9000 0x0000000000035000 r-- load16
0x00007fca32ce6000 0x00007fca32ce8000 0x0000000000035000 r-- load17
0x00007fca32ce8000 0x00007fca32cea000 0x0000000000037000 --- load18
0x00007fca32cea000 0x00007fca32cf1000 0x0000000000039000 --- load19
0x00007fca32d12000 0x00007fca32d13000 0x0000000000040000 r-- load20
0x00007fca32d13000 0x00007fca32d13000 0x0000000000041000 r-x load21
0x00007fca32d35000 0x00007fca32d35000 0x0000000000041000 r-- load22
0x00007fca32d3d000 0x00007fca32d3e000 0x0000000000041000 --- load23
0x00007fca32d3e000 0x00007fca32d3f000 0x0000000000042000 r-- load24
0x00007fca32d3f000 0x00007fca32d40000 0x0000000000043000 --- load25
0x00007fca32d40000 0x00007fca32d41000 0x0000000000044000 --- load26
0x00007fff92df3000 0x00007fff92e14000 0x0000000000045000 --- load27
0x00007fff92f4d000 0x00007fff92f50000 0x0000000000066000 r-- load28
0x00007fff92f50000 0x00007fff92f51000 0x0000000000069000 r-x load29
0xffffffffff600000 0xffffffffff601000 0x000000000006a000 r-x load30
Una alternativa es usar la función Corefile
de pwntools
:
$ python3 -q
>>> from pwn import Corefile
>>> core = Corefile('core')
[x] Parsing corefile...
[*] './core'
Arch: amd64-64-little
RIP: 0x7fca32b0f3eb
RSP: 0x7fff92e111e0
Exe: '/home/user/Documents/RE/easy/Sekure Decrypt/release/debug/dec' (0x562e29888000)
Fault: 0x1f204
[+] Parsing corefile...: Done
>>> core.mappings
[Mapping('/home/user/Documents/RE/easy/Sekure Decrypt/release/debug/dec', start=0x562e29888000, stop=0x562e29889000, size=0x1000, flags=0x4, page_offset=0x0), Mapping('/home/user/Documents/RE/easy/Sekure Decrypt/release/debug/dec', start=0x562e29889000, stop=0x562e2988a000, size=0x1000, flags=0x5, page_offset=0x1), Mapping('/home/user/Documents/RE/easy/Sekure Decrypt/release/debug/dec', start=0x562e2988a000, stop=0x562e2988b000, size=0x1000, flags=0x4, page_offset=0x2), Mapping('/home/user/Documents/RE/easy/Sekure Decrypt/release/debug/dec', start=0x562e2988b000, stop=0x562e2988c000, size=0x1000, flags=0x4, page_offset=0x2), Mapping('/home/user/Documents/RE/easy/Sekure Decrypt/release/debug/dec', start=0x562e2988c000, stop=0x562e2988d000, size=0x1000, flags=0x6, page_offset=0x3), Mapping('', start=0x562e2adce000, stop=0x562e2adef000, size=0x21000, flags=0x6, page_offset=0x0), Mapping('', start=0x7fca32ac6000, stop=0x7fca32ac9000, size=0x3000, flags=0x6, page_offset=0x0), Mapping('/usr/lib/x86_64-linux-gnu/libc-2.30.so', start=0x7fca32ac9000, stop=0x7fca32aee000, size=0x25000, flags=0x4, page_offset=0x0), Mapping('/usr/lib/x86_64-linux-gnu/libc-2.30.so', start=0x7fca32aee000, stop=0x7fca32c66000, size=0x178000, flags=0x5, page_offset=0x25), Mapping('/usr/lib/x86_64-linux-gnu/libc-2.30.so', start=0x7fca32c66000, stop=0x7fca32cb0000, size=0x4a000, flags=0x4, page_offset=0x19d), Mapping('/usr/lib/x86_64-linux-gnu/libc-2.30.so', start=0x7fca32cb0000, stop=0x7fca32cb3000, size=0x3000, flags=0x4, page_offset=0x1e6), Mapping('/usr/lib/x86_64-linux-gnu/libc-2.30.so', start=0x7fca32cb3000, stop=0x7fca32cb6000, size=0x3000, flags=0x6, page_offset=0x1e9), Mapping('', start=0x7fca32cb6000, stop=0x7fca32cba000, size=0x4000, flags=0x6, page_offset=0x0), Mapping('/usr/lib/libmcrypt.so.4.4.8', start=0x7fca32cba000, stop=0x7fca32cc0000, size=0x6000, flags=0x4, page_offset=0x0), Mapping('/usr/lib/libmcrypt.so.4.4.8', start=0x7fca32cc0000, stop=0x7fca32cd9000, size=0x19000, flags=0x5, page_offset=0x6), Mapping('/usr/lib/libmcrypt.so.4.4.8', start=0x7fca32cd9000, stop=0x7fca32ce6000, size=0xd000, flags=0x4, page_offset=0x1f), Mapping('/usr/lib/libmcrypt.so.4.4.8', start=0x7fca32ce6000, stop=0x7fca32ce8000, size=0x2000, flags=0x4, page_offset=0x2b), Mapping('/usr/lib/libmcrypt.so.4.4.8', start=0x7fca32ce8000, stop=0x7fca32cea000, size=0x2000, flags=0x6, page_offset=0x2d), Mapping('', start=0x7fca32cea000, stop=0x7fca32cf1000, size=0x7000, flags=0x6, page_offset=0x0), Mapping('/usr/lib/x86_64-linux-gnu/ld-2.30.so', start=0x7fca32d12000, stop=0x7fca32d13000, size=0x1000, flags=0x4, page_offset=0x0), Mapping('/usr/lib/x86_64-linux-gnu/ld-2.30.so', start=0x7fca32d13000, stop=0x7fca32d35000, size=0x22000, flags=0x5, page_offset=0x1), Mapping('/usr/lib/x86_64-linux-gnu/ld-2.30.so', start=0x7fca32d35000, stop=0x7fca32d3d000, size=0x8000, flags=0x4, page_offset=0x23), Mapping('', start=0x7fca32d3d000, stop=0x7fca32d3e000, size=0x1000, flags=0x6, page_offset=0x0), Mapping('/usr/lib/x86_64-linux-gnu/ld-2.30.so', start=0x7fca32d3e000, stop=0x7fca32d3f000, size=0x1000, flags=0x4, page_offset=0x2b), Mapping('/usr/lib/x86_64-linux-gnu/ld-2.30.so', start=0x7fca32d3f000, stop=0x7fca32d40000, size=0x1000, flags=0x6, page_offset=0x2c), Mapping('', start=0x7fca32d40000, stop=0x7fca32d41000, size=0x1000, flags=0x6, page_offset=0x0), Mapping('[stack]', start=0x7fff92df3000, stop=0x7fff92e14000, size=0x21000, flags=0x6, page_offset=0x0), Mapping('', start=0x7fff92f4d000, stop=0x7fff92f50000, size=0x3000, flags=0x4, page_offset=0x0), Mapping('[vdso]', start=0x7fff92f50000, stop=0x7fff92f51000, size=0x1000, flags=0x5, page_offset=0x0), Mapping('[vsyscall]', start=0xffffffffff600000, stop=0xffffffffff601000, size=0x1000, flags=0x1, page_offset=0x0)]
>>> print('\n'.join(map(str, core.mappings)))
562e29888000-562e29889000 r--p 1000 /home/user/Documents/RE/easy/Sekure Decrypt/release/debug/dec
562e29889000-562e2988a000 r-xp 1000 /home/user/Documents/RE/easy/Sekure Decrypt/release/debug/dec
562e2988a000-562e2988b000 r--p 1000 /home/user/Documents/RE/easy/Sekure Decrypt/release/debug/dec
562e2988b000-562e2988c000 r--p 1000 /home/user/Documents/RE/easy/Sekure Decrypt/release/debug/dec
562e2988c000-562e2988d000 rw-p 1000 /home/user/Documents/RE/easy/Sekure Decrypt/release/debug/dec
562e2adce000-562e2adef000 rw-p 21000
7fca32ac6000-7fca32ac9000 rw-p 3000
7fca32ac9000-7fca32aee000 r--p 25000 /usr/lib/x86_64-linux-gnu/libc-2.30.so
7fca32aee000-7fca32c66000 r-xp 178000 /usr/lib/x86_64-linux-gnu/libc-2.30.so
7fca32c66000-7fca32cb0000 r--p 4a000 /usr/lib/x86_64-linux-gnu/libc-2.30.so
7fca32cb0000-7fca32cb3000 r--p 3000 /usr/lib/x86_64-linux-gnu/libc-2.30.so
7fca32cb3000-7fca32cb6000 rw-p 3000 /usr/lib/x86_64-linux-gnu/libc-2.30.so
7fca32cb6000-7fca32cba000 rw-p 4000
7fca32cba000-7fca32cc0000 r--p 6000 /usr/lib/libmcrypt.so.4.4.8
7fca32cc0000-7fca32cd9000 r-xp 19000 /usr/lib/libmcrypt.so.4.4.8
7fca32cd9000-7fca32ce6000 r--p d000 /usr/lib/libmcrypt.so.4.4.8
7fca32ce6000-7fca32ce8000 r--p 2000 /usr/lib/libmcrypt.so.4.4.8
7fca32ce8000-7fca32cea000 rw-p 2000 /usr/lib/libmcrypt.so.4.4.8
7fca32cea000-7fca32cf1000 rw-p 7000
7fca32d12000-7fca32d13000 r--p 1000 /usr/lib/x86_64-linux-gnu/ld-2.30.so
7fca32d13000-7fca32d35000 r-xp 22000 /usr/lib/x86_64-linux-gnu/ld-2.30.so
7fca32d35000-7fca32d3d000 r--p 8000 /usr/lib/x86_64-linux-gnu/ld-2.30.so
7fca32d3d000-7fca32d3e000 rw-p 1000
7fca32d3e000-7fca32d3f000 r--p 1000 /usr/lib/x86_64-linux-gnu/ld-2.30.so
7fca32d3f000-7fca32d40000 rw-p 1000 /usr/lib/x86_64-linux-gnu/ld-2.30.so
7fca32d40000-7fca32d41000 rw-p 1000
7fff92df3000-7fff92e14000 rw-p 21000 [stack]
7fff92f4d000-7fff92f50000 r--p 3000
7fff92f50000-7fff92f51000 r-xp 1000 [vdso]
ffffffffff600000-ffffffffff601000 --xp 1000 [vsyscall]
Debemos recordar que el texto cifrado se almacena en el heap, que es el espacio de memoria que viene después del binario. En la salida anterior, el heap comienza en la dirección 0x562e2adce000
. Si leemos este espacio de memoria y dividimos el contenido en trozos de 16 bytes (recordemos que el texto cifrado tiene esta longitud), lo encontraremos fácilmente:
>>> core.read(0x562e2adce000, 2000)
b'\x00\x00\x00\x00\x00\x00\x00\x00\x91\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x01\x00\x00\x00\x00\x00\x00\x88$\xad\xfb\x00\x00\x00\x00\xc0\xe4\xdc*.V\x00\x00\xc0\xe4\xdc*.V\x00\x00\xb0\xe4\xdc*.V\x00\x00\xb0\xe4\xdc*.V\x00\x00\xb0\xe4\xdc*.V\x00\x00\xb0\xe4\xdc*.V\x00\x00\xb0\xe4\xdc*.V\x00\x00\xb0\xf4\xdc*.V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0E\xcb2\xca\x7f\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe3\xdc*.V\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x90\xe3\xdc*.V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0T\xcb2\xca\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`O\xcb2\xca\x7f\x00\x00!\x00\x00\x00\x00\x00\x00\x002&\x08\xdb\xef\x90\x0b\x1e\xbc\xd3\xa0Xq\x91H\x83\x00\x00\x00\x00\x00\x00\x00\x00\x11\x10\x00\x00\x00\x00\x00\x002&\x08\xdb\xef\x90\x0b\x1e\xbc\xd3\xa0Xq\x91H\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> data = core.read(0x562e2adce000, 2000)
>>> print('\n'.join([str(data[i : i + 16]) for i in range(0, len(data), 16)]))
b'\x00\x00\x00\x00\x00\x00\x00\x00\x91\x02\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
...
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x01\x00\x00\x00\x00\x00\x00'
b'\x88$\xad\xfb\x00\x00\x00\x00\xc0\xe4\xdc*.V\x00\x00'
b'\xc0\xe4\xdc*.V\x00\x00\xb0\xe4\xdc*.V\x00\x00'
b'\xb0\xe4\xdc*.V\x00\x00\xb0\xe4\xdc*.V\x00\x00'
b'\xb0\xe4\xdc*.V\x00\x00\xb0\xe4\xdc*.V\x00\x00'
b'\xb0\xf4\xdc*.V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\xc0E\xcb2\xca\x7f\x00\x00'
b'\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe3\xdc*.V\x00\x00'
b'\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x90\xe3\xdc*.V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\xa0T\xcb2\xca\x7f\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
...
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'`O\xcb2\xca\x7f\x00\x00!\x00\x00\x00\x00\x00\x00\x00'
b'2&\x08\xdb\xef\x90\x0b\x1e\xbc\xd3\xa0Xq\x91H\x83'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x11\x10\x00\x00\x00\x00\x00\x00'
b'2&\x08\xdb\xef\x90\x0b\x1e\xbc\xd3\xa0Xq\x91H\x83'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
...
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Este es:
b'2&\x08\xdb\xef\x90\x0b\x1e\xbc\xd3\xa0Xq\x91H\x83'
Flag
Ahora podemos crear el cifrador AES y descifrar el texto cifrado anterior para encontrar la flag:
>>> from Crypto.Cipher import AES
>>> cipher = AES.new(b'VXISlqY>Ve6D<{#F', AES.MODE_CBC, iv=b'A' * 16)
>>> cipher.decrypt(b'2&\x08\xdb\xef\x90\x0b\x1e\xbc\xd3\xa0Xq\x91H\x83')
b'HTB{t1m_l3arn_C}'