Sekure Decrypt
9 minutes to read
We are given a binary called dec
, the C source code (src.c
) and a core file (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'
Source code analysis
Since we have the source code, let’s analyze it:
#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;
}
Basically, it uses an AES cipher to decrypt a file called flag.enc
. To build the AES cipher (in CBC mode), we need to find the key and the initial vector (IV). From the source code, we already have the IV (AAAAAAAAAAAAAAAA
), but the key comes from an environment variable called KEY
.
If we take a look at the implementation of read_file
, we can find an error here:
fclose(&fp);
The &
tells the program to execute fclose
on the address where fp
is stored, so it should have been written as fclose(fp);
. Obviously, the program will crash because of this error.
Analyzing the core file
This bug must be the reason why we are given a core file, because these files are generated when there’s an error in the program. The use of core files is to let developers analyze what happened and find out where is the bug.
Finding the AES key
First of all, since environment variables are loaded into memory when the program starts, the AES key must be in the core file strings. We can filter by KEY
, since this is the name of the environment variable:
$ strings core | grep KEY
KEY=
KEY=VXISlqY>Ve6D<{#F
There it is.
Finding the ciphertext
Now we need to find the ciphertext. We already know that the length of the ciphertext is 16 because of these lines:
int buffer_len = 16;
void *ciphertext = read_file("flag.enc", buffer_len);
Also, the ciphertext string will be stored on the heap using 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;
}
Let’s try to execute the dec
binary in 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.
The program obviously crashes because of the programming error. However, let’s see the location of the ciphertext in memory:
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
We see that the heap is the memory space located right after the binary.
We could try to load the binary and the core file in GDB as follows, but the debugger does not run properly due to version mismatches:
$ 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
An alternative is to use Corefile
from 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]
We must recall that the ciphertext is stored on the heap, which is the memory space that comes after the binary. In the above output, the heap starts at address 0x562e2adce000
. If we read this memory space and split the contents in chunks of 16 bytes (remember that the ciphertext has this length), we will find it easily:
>>> 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'
There it is:
b'2&\x08\xdb\xef\x90\x0b\x1e\xbc\xd3\xa0Xq\x91H\x83'
Flag
Now we can create the AES cipher and decrypt the above ciphertext to find the 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}'