Ocolirea apelurilor ptrace cu LD_PRELOAD pe Linux

  • 1 minute de citit
  • 4 exemple de cod în C

Disponibil și în English

Salut,

Iată un articol scurt despre cum poți ocoli apelurile ptrace atunci când depanezi un executabil Linux.

Apelând ptrace cu opțiunea PTRACE_TRACEME, un proces poate detecta dacă este depanat și poate executa alte instrucțiuni. Aceasta este o tehnică eficientă de anti-debugging.

De exemplu, luați următorul program C:

int main() {    if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) {      printf("I'm being debugged!n");    } else {      printf("Normal flown");    }    return 0;}

Dacă executăm programul de mai sus obținem Normal flow pe ecran, dar dacă îl depanăm cu gdb obținem Err: I'm being debugged!

root@kali:~/Downloads# strace ./a.out ...munmap(0x7fb7c945e000, 90919)           = 0ptrace(PTRACE_TRACEME)                  = -1 EPERM (Operation not permitted)fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0brk(NULL)                               = 0x55c2d37e6000brk(0x55c2d3807000)                     = 0x55c2d3807000write(1, "Err: I'm being debugged!n", 25Err: I'm being debugged!) = 25exit_group(0)                           = ?+++ exited with 0 +++

Pentru a ocoli această verificare, putem folosi variabila de mediu LD_PRELOAD. Ea ne permite să controlăm calea de încărcare a unei biblioteci partajate, ceea ce ne permite să înlocuim funcțiile bibliotecii, cum ar fi ptrace.

Putem crea următorul fișier:

long ptrace(int request, int pid, void *addr, void *data) {    return 0;}

Și îl compilăm ca bibliotecă partajată cu următoarea comandă:

gcc -shared ptrace.c -o ptrace.so

Apoi, putem seta variabila de mediu LD_PRELOAD folosind următoarele comenzi:

  • în shell: export LD_PRELOAD=./ptrace.so
  • în gdb: set environment LD_PRELOAD=./ptrace.so

Demonstrație:

gdb-peda$ file a.out Reading symbols from a.out...(No debugging symbols found in a.out)gdb-peda$ rStarting program: /root/Downloads/a.out Err: I'm being debugged![Inferior 1 (process 1939) exited normally]Warning: not runninggdb-peda$ set environment LD_PRELOAD=./ptrace.sogdb-peda$ rStarting program: /root/Downloads/a.out Normal flow[Inferior 1 (process 1946) exited normally]Warning: not runninggdb-peda$ 

Mulțumesc că ai citit!