Programare i securitate la nivelul arhitecturii x 86

  • Slides: 23
Download presentation
Programare și securitate la nivelul arhitecturii x 86 Cursul 3 Limbajul de asamblare al

Programare și securitate la nivelul arhitecturii x 86 Cursul 3 Limbajul de asamblare al familiei ISA x 86

Formatul instructiunilor ISAx 86 Sursa: http: //www. c-jump. com/CIS 77/CPU/x 86/lecture. html#X 77_0010_real_encoding)

Formatul instructiunilor ISAx 86 Sursa: http: //www. c-jump. com/CIS 77/CPU/x 86/lecture. html#X 77_0010_real_encoding)

Formatul instructiunilor x 86 prefix cod operatie Reg/Mod sib deplasament data imediata n Formatul

Formatul instructiunilor x 86 prefix cod operatie Reg/Mod sib deplasament data imediata n Formatul instr. x 86 – variabil ca lungime si continut n Semnificatia campurilor: • Prefix: unul sau mai multi octeti care preced instructiunea si modifica modul de executie al acesteia n • tipuri: segment explicit, dim. adresa (16/32 biti), dim. operand (16/32 biti), repetare instr. , blocare acces (lock), operanzi de 64 biti (REX) Cod operatie: 1. . 2 octeti, care codifica tipul de operatie n instr. setului de baza au codul operatiei pe 1 octet

Formatul instructiunilor x 86 n Reg/Mod : specifica registrele folosite si modul de adresare

Formatul instructiunilor x 86 n Reg/Mod : specifica registrele folosite si modul de adresare adoptat n n n 7 6 5 4 3 2 1 0 Mod Reg. R/M Mod: modul de adresare folosit (registru-registru, registrumemorie Reg: codul registrului folosit R/M: al doilea registru folosit sau modul de adresare a memoriei n sib: scala-index-baza – detaliaza modul de adresare folosit Deplasament: contine o adresa pe 8, 16 sau 32 biti, n Data imediata: contine o valoare constanta pe 8, 16 sau n n n folosita pentru calculul adresei unui operand 32 de biti instructiunea cea mai scurta: 1 octet instructiunea cea mai lunga: ~ 16 octeti

Clase de instructiuni n De baza – 8086/386 … x 86 -64 n n

Clase de instructiuni n De baza – 8086/386 … x 86 -64 n n Implementeaza operatii aritmetice in virgula fixa Folosesc registre generale: n n n Registre speciale: n n n 8 biti – AL, Ah, BL, Bh…. DH 16 Biti - AX, BX, CX, DX, SI, DI, SP, BP 32 biti – EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 64 biti - EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP, R 8 -R 15 CS, DS, ES, SS, FS, GS CR 0, CR 1, CR 2, CR 3, CR 4 GDTR, LDTR, IDTR Unele instructiuni executate fara restrictii, altele doar in modul protejat (ex. IN/OUT, STI/CLI) Exemple: MOV, ADD, AND, JMP, JC, CALL,

Clase de instructiuni n Instructiuni ale coprocesorului matematic 8087/287 n n Implementeaza aritmetica in

Clase de instructiuni n Instructiuni ale coprocesorului matematic 8087/287 n n Implementeaza aritmetica in virgula flotanta Registre organizate intr-o stiva: n n n 80 BITI - ST 0, ST 1, . . ST 7 Majoritatea instructiunilor lucreaza implicit cu varful stivei – nu se mai precizeaza operandul/operanzii) Exemple: FLD, FST, FADD, FYL 2 X

Clase de instructiuni n Instructiuni MMX n n n Pentru aritmetica paralela pe intregi

Clase de instructiuni n Instructiuni MMX n n n Pentru aritmetica paralela pe intregi (modelul SIMD – single instruction multiple data) Implementeaza aritmetica “cu saturatie” Foloseste 8 registre pe 64 biti: n n n 64 biti – MM 0, MM 1, …. MM 7 Exemple: PADD, PMUL, PAND, PMADD Instructiuni SSE 2 n Pentru aritmetica paralela pe numere in virgula flotanta

Instructiuni speciale n n Identificarea tipului de procesor Masurarea timpilor de executie in numar

Instructiuni speciale n n Identificarea tipului de procesor Masurarea timpilor de executie in numar de cicluri de ceas

Identificarea tipului de procesor – instr. CPUID n n CPUID – CPU Identifier Introdus

Identificarea tipului de procesor – instr. CPUID n n CPUID – CPU Identifier Introdus la ‘ 486 si apoi la Pentium pt. a identifica tipul si varianta constructiva a unui procesor – pentru a optimiza codul in functie de capabilitatile procesorului EFLAGS. bit_21=1 – arata daca se poate folosi CPUID are 2 seturi de functii apelabile prin valoarea incarcata in EAX: n n n Functii de baza – returneaza informatii despre procesor Functii extinse – returneaza functii extinse despre procesor Determinarea numarului maxim de functii implementate: MOV EAX, 0 H CPUID ; in EAX nr. maxim de functii de baza utilizabile MOV EAX, 80000000 H CPUID ; in EAX nr. maxim de functii extinse utilizabile

CPUID n EAX=0, CPIUD returneaza n n n EAX – nr. maxim de functii

CPUID n EAX=0, CPIUD returneaza n n n EAX – nr. maxim de functii de baza EBX, EDX, ECX sir de caractere ce identifica producatorul (ex: Genuine. Intel) EAX=1 n 31 27 19 15 13 11 7 3 0 EAX Reserved Processor type Extended family Extended model 00 –original OME Processor type 01 -Overdrive Family code 10 – Dual Model number Stepping ID 11 -reserved Semnatura procesorului

CPUID n EAX=1 (continuare) n EBX n n n Bits 7 -0: Brand Index

CPUID n EAX=1 (continuare) n EBX n n n Bits 7 -0: Brand Index Bits 15 - 8: CLFLUSH line size. (Value returned * 8 = cache line size) Valid only if CLFSH feature flag is set Bits 23 -16: Count of logical processors. Valid only if Hyper-Threading Technology flag is set Bits 31 -24: Processor local APIC physical ID. Valid for Pentium 4 and subsequent processors EDX – indicatori de caracteristici (http: //bochs. sourceforge. net/techspec/24161821. pdf, Tabelul 5)

CPUID n EAX = 2 n n EAX, EBX, ECX, EDX – Descriptori pentru

CPUID n EAX = 2 n n EAX, EBX, ECX, EDX – Descriptori pentru Cache si TLB EAX=2 h n n ECX Bits 31 -0 of 96 -bit processor serial number. (Available only in Pentium III processors when the PSN feature flag is set; otherwise, the value in this register is reserved. ) EDX Bits 31 -0 the 96 -bit processor serial number. (Available only in Pentium III processors when the PSN feature flag is set; otherwise, the value in this register is reserved. )

CPUID – functii extinse n EAX=80000000 H n n EAX=80000001 H – n n

CPUID – functii extinse n EAX=80000000 H n n EAX=80000001 H – n n EAX Processor Brand String EBX, ECX, EDX Processor Brand String Continued EAX=80000003 H – n n EAX Extended Processor Signature and Extended Feature Bits (Currently Reserved. ) EBX, ECX, EDX Reserved EAX=80000002 H – n n EAX Maximum Input Value for Extended Function CPUID Information EBX, ECX, EDX Reserved EAX, EBX, ECX, EDX Processor Brand String Continued EAX=80000004 H – n EAX, EBX, ECX, EDX Processor Brand String Continued

Secventa corecta de identificare a unui procesor To identify the processor using the CPUID

Secventa corecta de identificare a unui procesor To identify the processor using the CPUID instructions, software should follow the following steps. 1. Determine if the CPUID instruction is supported by modifying the ID flag in the EFLAGS register. If the ID flag cannot be modified, the processor cannot be identified using the CPUID instruction. 2. Execute the CPUID instruction with EAX equal to 80000000 h. CPUID function 80000000 h is used to determine if Brand String is supported. If the CPUID function 80000000 h returns a value in EAX greater than 80000000 h the Brand String feature is supported and software should use CPUID functions 80000002 h through 80000004 h to identify the processor. 3. If the Brand String feature is not supported, execute CPUID with EAX equal to 1. CPUID function 1 returns the processor signature in the EAX register, and the Brand ID in the EBX register bits 0 through 7. If the EBX register bits 0 through 7 contain a nonzero value, the Brand ID is supported. Software should scan the list of Brand Ids (see Table 9) to identify the processor. 4. If the Brand ID feature is not supported, software should use the processor signature (see Figure 2) in conjunction with the cache descriptors (see Table 7) to identify the processor. Exemplu de program in asamblare: http: //bochs. sourceforge. net/techspec/24161821. pdf

RDTSC – Read Time Stamp Counter n n RDTSC – instructiune ce permite o

RDTSC – Read Time Stamp Counter n n RDTSC – instructiune ce permite o masurare mai precisa a timpului de executie a unor (secvente de ) instructiuni Se bazeaza pe un contor intern de cicluri de ceas – n n Time-Stamp Counter – contor pe 64 biti In urma executarii instructiunii RDTSC se obtine: EDX – partea mai semnificatica a contorului n EAX – partea mai putin semnificativa a contorului Timp_execsec= nr_cicluri /frecventa_ceas. Hz n n Cauze pentru care valoarea citita poate fi eronata: n n Revenirea la 0 a contorului nu este o problema (se da peste cap in aprox. 136 ani la un procesor de 4 GHz) La executia “out-of-order” a instructiunilor ordinea de executie nu tine cont de ordinea instructiunilor in program (unele instructiuni se pot executa mai repede) La procesoarele multi-core exista cate un contor pentru fiecare core Prezenta memoriei cache determina masuratori diferite la prima si respectiv urmatoarele executii ale unei secvente de program n n a doua oara instructiunile si datele sunt deja in cache Se evita prin omiterea timpului de executie pentru primul ciclu sau prin calcylarea unei medii pentru un numar mai mare de executii

RDTSC – Read Time stamp Counter n Secventa care poate genera erori de citire:

RDTSC – Read Time stamp Counter n Secventa care poate genera erori de citire: rdtsc mov time, eax fdiv rdtsc sub eax, time n Secventa corecta: cpuid rdtsc mov time, eax fdiv cpuid rdtsc sub eax, time ; ; ; citeste marca de timp muta valoarea intro variabila instructiunea testata (impartire in flotant) citeste a doua marca de timp afla diferenta ; ; ; ; forteaza terminarea instructiunilor anterioare citeste marca de timp muta valoarea in variabila instructiunea testata forteaza terminarea instructiunii anterioare citeste marca de timp afla diferenta

Executia programelor in modul “User” si “Kernel” n n in multe SO se face

Executia programelor in modul “User” si “Kernel” n n in multe SO se face distinctie intre executia unui program in “User mode” sau kernel mode” (ex. Windows) Procesoarele Intel permit folosirea a 4 nivele de privilegiu: n n n Nivelul 0 – modul kernel – se permite accesul la toate resursele calculatorului Nivelele 1 si 2 – utilizabile pentru drivere ale unor alte firme sau pentru mai multe masini virtuale Nivelul 3 – modul user – permite acces restrictionat doar la anumite resurse; n resurse restrictionate: n instructiuni critice (In/Out, STI/Cli), n registre de control (GDTR/LDTR, IDTR), n tabela de intreruperi, n Tabele de pagina, etc.

Mod User v. s. Mod kernel n Mod user n n n Toate procesele

Mod User v. s. Mod kernel n Mod user n n n Toate procesele lansate in Windows, exceptand procesul “System” ruleaza in modul user Procesele au acces doar la zonele de memorie (ex. paginile) alocate fiecaruia Accesul la resurse restrictionate NUMAI prin functii ale kernelului, accesibile prin API-uri incluse in bibliotecile limbajului de programare

Mod User v. s. Mod kernel n Modul Kernel n n n Procesorul trece

Mod User v. s. Mod kernel n Modul Kernel n n n Procesorul trece in modul kernel la incarcarea si lansarea sistemului de operare La initializarea SO se seteaza tabelele de pagini, tabela de intreruperi si tabelele de descriptori Kernelul poate lansa procese sistem in modul user Revenirea in modul kernel se face la aparitia unor intreruperi; rutinele de intrerupere (handlerele) sunt executate in modul kernel; la terminarea executiei unui handler se revine la procesul intrerupt (care se executa in modul user) La apelarea unei functii Windows API se genereaza o intrerupere care provoaca trecerea procesorului in modul kernel, si executia functiei in acest mod; la terminare se revine in modul user

Mod kernel n Modul kernel (cont) n Intreruperea folosita pentru apel de functie kernel:

Mod kernel n Modul kernel (cont) n Intreruperea folosita pentru apel de functie kernel: INT 2 EH ; EAX trebuie sa contina codul functiei apelate ; EBX trebuie sa contina un poantor catre parametrii de apel pastrati pe stiva user; acestia se vor copia pe stiva kernel n § Revenirea din rutina: § IRET

Mod User v. s. Mod kernel n Modul Kernel (cont. ) n n Observatii:

Mod User v. s. Mod kernel n Modul Kernel (cont. ) n n Observatii: de fapt functia API apelata de procesul user apeleaza un “API nativ” Windows NT si abia atunci se trece in modul kernel Noile procesoare Intel au instructiuni mai rapide de apelare a unor functii sistem: n Sysenter – apeleaza o functie in modul kernel (nivelul 0) evitanduse procedura de tratare a unei intreruperi n n Aparute la Pentium II SYSEXIT – revenirea rapida din modul kernel (nivelul 0) in modul user (nivelul 3)

Apelul unor functii din kernel n SYSENTER - compuare rapida de context din user

Apelul unor functii din kernel n SYSENTER - compuare rapida de context din user in kernel n In prealabil trebuie sa se seteze: n n SYSENTER_CS_MSR – (adr. 174 H) Contine selectorul pentru segmentul de cod de 32 biti ce contine functia kernel (acest selector este folosit si pentru a calcula selectorul stivei din modul kernel) SYSENTER_EIP_MSR - (adr. 175 H) Contine offsetul pe 32 biti al functiei apelate din modul kernel SYSENTER_ESP_MSR - (adr. 176 H) Contine poantorul pe 32 biti al stivei din modul kernel Ce face: n n n n Incarca in CS continutul registrului SYSENTER_CS_MSR Incarca in EIP continutul registrului SYSENTER_EIP_MSR Incarca in ESP continutul registrului SYSENTER_ESP_MSR plus 8 Comuta procesorul pe nivelul 0 (kernel) Sterge indicatorul VM din EFLAGS (daca este setat) Incepe executia functiei apelate !!!! procesorul NU salveaza adresa de revenire (CS: EIP vechi); rutina (ex. un stub din DLL) prin care se face apelul instructiunii SYSENTER trebuie sa salveze aceasta adresa undeva, daca se doreste revenirea in procesul user

Apelul unor functii din kernel n SYSEXIT – comutare rapida de context din kernel

Apelul unor functii din kernel n SYSEXIT – comutare rapida de context din kernel in user n In prealabil trebuie sa se puna: n n SYSENTER_CS_MSR - Contains the 32 -bit segment selector for the privilege level 0 code segment in which the processor is currently executing. (This value is used to compute the segment selectors for the privilege level 3 code and stack segments. ) EDX - Contains the 32 -bit offset into the privilege level 3 code segment to the first instruction to be executed in the user code. ECX - Contains the 32 -bit stack pointer for the privilege level 3 stack. Ce face: n n n Adds 16 to the value in SYSENTER_CS_MSR and loads the sum into the CS selector register. Loads the instruction pointer from the EDX register into the EIP register. Adds 24 to the value in SYSENTER_CS_MSR and loads the sum into the SS selector register. Loads the stack pointer from the ECX register into the ESP register. Switches to privilege level 3. Begins executing the user code at the EIP address.