Mecanisme de Protecție
1 - Verificarea Activării unor Mecanisme de Securitate 💁
Prima sarcină poate fi rezolvată cu utilitarul nm
. Se observă faptul că al doilea executabil nu are niciun simbol, ceea ce indică utilizarea după compilare a strip
.
$ nm fortress.elf | wc -l
41
$ nm fortress.stripped.elf | wc -l
nm: fortress.stripped.elf: no symbols
0
Pentru următorul set de executabile, dimensiunea fortress.packed.elf
este cu mult mai mică decât a celuilalt executabil (care a fost compilat static, de unde și dimensiunea mare).
$ ls -sh fortress.static.elf fortress.packed.elf
304K fortress.packed.elf 696K fortress.static.elf
Împreună cu o observație referitoare la tipul de șiruri de caractere găsite în primul executabil menționat (de tipul UPX!
, ?OTHT
și tdx~x{
), putem să deducem împachetarea programului. Concluzia poate fi verificată suplimentar cu utilitarul upx
.
$ upx -t fortress.packed.elf
[...]
testing fortress.packed.elf [OK]
[...]
Mecanismele de securitate ale executabilului fortress.elf
se pot verifica prin comanda checksec
, ce este oferită de librăria Python 3 deja instalată pwntools
. Se observă în ieșire că mecanismele de protecție a stivei, cu canarii, și NX sunt activate.
$ checksec fortress.elf
[*] 'fortress.elf'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x8048000)
Suplimentar, din Ghidra, se pot extrage informații despre modalitatea în care se efectuează verificarea canariilor. Decompilarea funcției main
arată faptul că pe stivă este plasată o valoare (variabila iVar1
), populată cu gs:0x14
și verificată la sfârșit.
undefined4 main(void)
{
int iVar1;
undefined4 uVar2;
int in_GS_OFFSET;
iVar1 = *(int *)(in_GS_OFFSET + 0x14);
[...]
if (iVar1 != *(int *)(in_GS_OFFSET + 0x14)) {
uVar2 = __stack_chk_fail_local();
}
return uVar2;
}
După verificarea secțiunilor, se constată faptul că niciuna nu are drepturi de execuție și scriere în același timp.
$ readelf --sections fortress.elf
There are 31 section headers, starting at offset 0x387c:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 080481b4 0001b4 000013 00 A 0 0 1
[...]
Pentru completarea ultimei sarcini, prin verificarea conținutului fișierului /proc/sys/kernel/randomize_va_space
se obține un număr ce, dacă este nenul, indică activarea mecanismului ASLR.