Úvod do x86 strojového kódu a assembleru

  • Upload
    idiftl

  • View
    212

  • Download
    0

Embed Size (px)

Citation preview

vod do x86 strojovho kdu a assembleru

Nudn ale nevyhnutn

Na o preBoha assembler?

Znalos vs. vyuvanie

Kvalitn znalos vyaduje aspo nejak vyuvanie

Vyuvanie neznamen len programovanie v om

Vyuitie:Reverse engineering

Driver / system level programming

Copy protection

Machine code manipulation (compiler, packer, analyzer...)

????

Profit

X86 milestones

8086 (16-bit)

80286 (chrnen md)

80386 (32-bitov chrnen md + mnostvo novch fir)

X86-64

Rozren intrukn sady: FPU (x87), MMX, SSE, SSE2, SSE3, SSSE3, SSE4, SSE5, VMX, SMX, SVM, AVX, XOP, ...

Chrbtica x86

CPU

NorthbridgeRAMVideo RAMOM

Southbridge

Vetko ostatn

(nie naozaj)

o z toho pre ns vyplva

Procesor pristupuje k vetkm zariadeniam tm istm mechanizmom (ako k RAM), nepotrebuje zvltne intrukcie nie celkom pravda, ale pre n el uiton abstrakcia

Nebudeme sa zaobera systmovmi a mlo pouvanmi intrukciami (segmentcia, strnkovanie, task switching, strnkovanie, 16-bit a real md)

Sta nm zvldnu zkladn opercie a prcu s pamou

Intrukcie

Pokyny pre procesor (CPU) uloen v pamti

CPU ich ta a vykonva

Principilne sa nim nelia od bench dt v pamti

DOS program na rieenie sudoku (62 bytov):

B4 3F 8B D5 CD 21 91 43 88 02 4E 78 F7 B8 31 40 80 3A 2E 75 F5 8B F9 4F 60 78 ED 38 03 75 11 97 D4 13 6B C0 0B 96 43 7B F7 33 C6 A9 C0 E0 7E 02 F6 E4 61 70 E2 C6 02 2E 3C 39 74 F6 EB D1

Zpisy intrukcii

Binrny: 00000001 11011000

Hexadecimlny: 01 D80000-0001 1101-1000

Osmikov: 001 33000-000-001 11-011-000

Desiatkov:fuj

Assembler:add eax, ebxadd %ebx, %eax (fuj)

0000-00001-10010-20011-30100-40101-50110-60111-7

1000-81001-91010-A1011-B1100-C1101-D1110-E1111-F

General purpose registre

Register = premenn procesoru

CPU m mnostvo registrov, 99.9% asu sa ale pracuje s general purpose registrami (GPR)V benej (?) rei preto Register = General Purpose Register

x86 m 8 GPR (a x86-64 rozrilo poet na 16)

8086 mal 16-bitov GPR registre: AX, BX, CX, DX, SP, BP, SI, DI

Monos pristupova k 8-bit astiam prvch 4 registrov:AL (low), AH (high), BL, BH, CL, CH, DL, DH

386 rozril na 32-bitov:EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI

pecializovan vyuitie
general purpose registrov

0 = [E]AX = accumulator1 = [E]CX = counter2 = [E]DX = data3 = [E]BX = base4 = [E]SP = stack pointer5 = [E]BP = base pointer6 = [E]SI = source index7 = [E]DI = destrination index

Formt x86 intrukcie

Prefix voliten byte pred intrukciou, menia jej funknos

Mnemonics udva zkladn operciu ktor sa vykon

Operand udva register alebo pamov premennp, nad ktorou sa vykon opercia. Operandy mu by 0 a 3.Operandy musia by rovnakej vekosti

Cieov (destination) operand prv

Niektor intrukcie maj implicitn operand

Presun / priradenie hodnoty GPR

MOV (move)mov eax, 31337mov ecx, 123mov esi, edxmov bh, almov al, 500(neplatn)mov eax, sp(neplatn)mov ah, ebx(neplatn)

Set / Rozdiel

ADD (addition)add ebx, eaxadd esp, 1

INC (increment, jeden operand)inc eax

SUB (subtract)sub ebp, 20sub eax, ebx

DEC (decrement, jeden operand)dec ecx

Bitov opercie

ANDand al, 11111100b

XORxor al, 101b

ORor al, 100b

NOT (jeden operand)not al

Negatvne sla

sla ktor mu nadobda aj zporn hodnotu sa nazvaj znamienkov

Existuje niekoko monost ako ich reprezentova v binrnej forme

Najikovnej two's complementTie ist opercie pre znamienkov aj neznamienkov sla

Horn bit udva znamienko

Podteenie: najmenia hodnota 1 = najvia hodnota

Preteenie: najvia hodnota +1 = najvia hodnota

Two's complement

00000001 (1)-00000001 (1)00000000 (0)

00000010 (2)-00000001 (1)00000001 (1)

00000111 (7)-00000010 (2)00000101 (5)

00000000 (0)-00000001 (1)11111111 (255)

00000000 (0)-00000010 (1)11111110 (254)

00000011 (3)+11111111 (255)00000010 (2)

Negatvne sla

add eax, ebxsub ecx, 5add al, -1 add al, 255sub al, 1sub cl, -5sub cl, 251add cl, 5

Negcia sla

NEG (negation)neg eaxneg dxneg cl

Bitwise spsobnot eaxinc eax

Napr.:00000001 (1)not11111110 (-2)+111111111 (-1)

Pam (z pohadu CPU)

Pole bytov

Adresovan 32-bitovm slom, toto udva pozciu (index) bytu v poli.

Nieje mon pristupova k dvom miestam v pamti vrmci jednej intrukcie

Zpis operandu pre prstup k pamti v assembleri:[adresa](adresa v hranatch ztvorkch)

Priama adrescia pamte

mov al, [1]mov [2], aladd [0], eaxxor esp, [20]mov [30], [29]- neexistujesub [0], [1]-neexistuje

Endianness

Monos pristupova k pamti v rznych vekostiach8-bit - byte16-bit - word32-bit - dword (double word)64-bit - qword (quad word, X86-64 only)

Poradie bytov vo vch slach od najmenej vznamnho po najviac vznamn (tzv. little endian)byty 00h, 01h = word 100h = word 100000000b = 256

byty 11h, 22h, 33h, 44h = dword 44332211h

Priama adrescia pamte

mov eax, [1234]mov eax, dword [1234]mov [31337], ecxadd [20], ebxinc byte [0]inc word [0]neg dword [1]

Nepriama adrescia pamte

Ako adresa me by pouit aj hodnota v registri:mov eax, dword [ebx]mov al, byte [esi]

K registru v adrese me by pripotan kontantamov edx, dword [ebx+4]mov al, byte [esi-1]

Nepriama adrescia pamte

pln forma 32-bitovej adrescie:[base + scale*index + displacement]base - ubovoln registerscale - kontanta 1, 2, 4, alebo 8index - ubovoln registerdisplacement - seln 32-bit kontanta

Naprklad:[ebx + 4*edi + 401224][eax + eax] = [2*eax][8*eax][3*ebx + 3] = [ebx + 2*ebx + 3]

Nepodmienen skok

JMP (jump, nepodmienen skok)jmp 200jmp dword [200]jmp eaxjmp dword [eax]

V assembleri seln adresy nahrdzame symbolickmi nvestiami:jmp konieckoniec:

Prznaky

CPU m register flags (korektne prznaky, hovorovo flagy)

Kad z jeho bitov m samostatn vznam

Netame ani nezapisujeme ho priamo

Nastavuje sa poda vsledku (nielen) aritmetickch intrukcii

Prznaky

CF (carry flag)Nastav sa ak opercia preteie ako celoseln

Inak vyuvan intrukciami ktor potrebuj nejak flag

OF (overflow flag)Nastav sa ak opercia preteie ako znamienkov

SF (sign flag)Nastav sa ak je vsledkom opercie zporn slo (horn bit vsledku je 1)

ZF (zero flag)Nastav sa ak vsledok opercie je nula.

Preteenie

mov al, 0sub al, 1CF=1, OF=0, SF=1

mov al, 0add al, 11111111bCF=0, OF=1, SF=1

mov al, 0sub al, 11111111bCF=1, OF=1, SF=0

Podmienen skoky

Sku iba ak je splnen podmienkaJC (jump if carry)- CF=1JNC (jump if not carry)- CF=0JO (jump if overflow)- OF=1JNO (jump if not overflow)- OF=0JS (jump if signed)- SF=1JNS (jump if not signed)- SF=0JZ (jump if zero)- ZF=1JNZ (jump if not zero)- ZF=0

Prklad:
Nulovanie 16 bytov

mov ecx, 16 ;nuluj 16 bytovmov edi, 5 ;od adresy 5nuluj:mov byte [edi], 0 ;vynuluj byte na adrese EDIinc edi ;posun EDI na dalsi bytedec ecx ;dalsi byte hotovyjnz nuluj ;ak je ecx>0, opakuj cyklus

CMP

CMP (compare)Porovnva dva operandy

Nastav flagy pre pecilne skoky

V skutonosti SUB ktor neprepe cieov register, iba nastav flagy poda vsledku odpotania.

Prklady:cmp eax, ebxcmp eax, dword [4]cmp byte [eax], dlcmp ecx, 30

CMP pre neznamienkov sla

Podmienen skoky:JB jump if 1st operand below 2ndJBE jump if 1st operand below or equal to 2ndJE jump if 1st operand equal to 2ndJAE jump if 1st operand above or equal to 2ndJA jump if 1st operand above 2nd

Pre kad z nich mono obrti podmienku: JN (jump if not) namiesto J (jump if)

CMP pre znamienkov sla

Podmienen skoky:JL jump if 1st operand lower than 2ndJLE jump if 1st operand lower than or equal to 2ndJE jump if 1st operand equal to 2ndJGE jump if 1st operand greater than or equal to 2ndJG jump if 1st operand greater than 2nd

Pre kad z nich mono obrti podmienku: JN (jump if not) namiesto J (jump if)

Prklad #2
Nulovanie 16 bytov inak

mov ecx, 0

nuluj:mov byte [ecx+5], 0 ;vynuluj ECX-ty byte od;adresy 5inc ecx ;dalsi byte hotovycmp ecx, 16 ;hotovych 16 bytov?jne nuluj ;ak je ecx>0, opakuj cyklus

Prklad #3
Porovnanie reazcov

mov esi, retazec1mov edi, retazec2porovnaj:mov al, byte [esi] ;nacitaj znak prvehocmp byte [edi], al ;porovnaj so znakom;druhehoja druhy_vacsi ;znak druheho vacsi?jb prvy_vacsi ;znak druheho mensi?inc esi ;ak su rovnake, posuninc edi ;na dalsi znakjmp porovnaj ;a repete

o je assembler?

Program, ktor preklad symbolick zpis intrukcii na binrny strojov kd

Syntax zpisu intrukcii sa medzi rznymi assemblermi viac i menej odliuje

Z toho prenesene assembler ako oznaenie niektorej konkrtnej syntaxe

V irokom zmysle sa assembler pouva aj ako oznaenie ubovolnej syntaxe ktor reprezentuje priamo strojov kd

Rozren assemblery

MASM (Microsoft Macro Assembler)MASM32 projekt

gas (GNU Assembler)

NASM (Netwide Assembler)YASM (Yet-another Assembler, ...)

FASM (Flat Assembler)

GoAsm, HLA (High Level Assembly), RosAsm

Zdroje pre tdium

Intel x86 CPU manualshttp://developer.intel.com/products/processor/manuals/index.htm

AMD CPU manualshttp://developer.amd.com/documentation/guides/pages/default.aspx#manuals

Art of assembly programming (Randall Hyde)http://webster.cs.ucr.edu/

Asm komunity:http://www.asmcommunity.net/board/ (General)

http://board.flatassembler.net (FASM)

http://www.masm32.com/board/ (MASM)

Newsgroups: alt.lang.asm, comp.lang.x86.asm

Nabudce (?)

Zsobnk

Procedry

Volacie tandardy (stdcall, ccall, fastcall, vararg)

alie prdavn intrukcie

o ma ete napadne

Socializcia

vid (nie 'Vid')

[email protected]