REbejs. 1. workshop (draft0)

Podobné dokumenty
ISU Cvičení 3. Marta Čudová

Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/YOS: Přednáška I / 21

ISU Cvičení 7. Marta Čudová

Registry 32 bitové pro všeobecné použití: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP.

Procesor z pohledu programátora

Petr Krajča. 26. říjen, 2012

x86 assembler and inline assembler in GCC

Assembler x86. Studijní text pro předmět: Strojově orientované jazyky Petr Olivka. Katedra informatiky VŠB-TU Ostrava

Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/YOS: Přednáška II. 14. říjen, / 26

8. Laboratoř: Aritmetika a řídicí struktury programu

Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).

Assembler - 2.část. poslední změna této stránky: Zpět

Operační systémy 2. Přednáška číslo 1. Úvod do OS

Popis instrukční sady procesoru ADOP

Struktura a architektura počítačů (BI-SAP) 7

IPA - Lab.1 Úvod do programování v ASM

Předmluva 13 Použité konvence 14. KAPITOLA 1 Základní číselné soustavy a pojmy Číselné soustavy a převody 15 1.

ISU Cvičení 2. Marta Čudová

ISU Cvičení 2. Marta Čudová

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 10

Kubatova Y36SAP 8. Strojový kód Jazyk symbolických instrukcí asembler JSA pro ADOP a AVR Kubátová Y36SAP-strojový kód 1

Architektura počítačů

a operačních systémů

Assembler DRUHÁ ČÁST OBSAH.

Assembler RISC RISC MIPS. T.Mainzer, kiv.zcu.cz

Simulátory aplikačně specifických instrukčních procesorů Jazyk LISA. Masařík Karel

Úvod. Instrukce musí obsahovat: typ operace adresu operandu (operandů) typ operandů modifikátory adresy modifikátory operace POT POT

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Přednáška 2 A4B38NVS - Návrh vestavěných systémů 2014, kat. měření, ČVUT - FEL, Praha J. Fischer A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 1

Architektura počítačů. Instrukce a návrh instrukční sady. Lubomír Bulej KDSS MFF UK

Princip funkce počítače

Program "Světla" pro mikropočítač PMI-80

Kubatova Y36SAP procesor - control unit obvodový a mikroprogramový řadič RISC Y36SAP-control unit 1

Assembler - 1.část. poslední změna této stránky: Zpět

Adresní mody procesoru

Úroveň strojového kódu procesor Intel Pentium Zásobník a konvencie volania

Seznámení s mikropočítačem. Architektura mikropočítače. Instrukce. Paměť. Čítače. Porovnání s AT89C2051

Programátorský model x86

Čísla, reprezentace, zjednodušené výpočty

Činnost CPU. IMTEE Přednáška č. 2. Několik úrovní abstrakce od obvodů CPU: Hodinový cyklus fáze strojový cyklus instrukční cyklus

Anotující disassembler pro AMD64

Pohled do nitra mikroprocesoru

ČÁST 1. Základy 32bitového programování ve Windows

Michal Brandejs. Mikroprocesory Intel Pentium

Architektury VLIW M. Skrbek a I. Šimeček

Assembler - 5.část. poslední změna této stránky: Zpět

Úroveň strojového kódu procesor Intel Pentium Úvod

Popis instrukční sady - procesory PIC Aritmetické a logické operace

Instrukční soubory, registrové struktury, způsoby adresace. INP 2008 FIT VUT v Brně

Strojový kód. Instrukce počítače

Kubatova Y36SAP 9. Strojový kód ISA architektura souboru instrukcí střadačově, zásobníkově orientovaná, GPR Kubátová Y36SAP-ISA 1

Assembler - 4.část. poslední změna této stránky: Zpět

Principy počítačů a operačních systémů

Jazyk symbolických adres

KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO ASSEMBLER VÝVOJ TOHOTO UČEBNÍHO TEXTU JE SPOLUFINANCOVÁN

MIDAM MW 240 modbus 2 x DI, 2 x DO

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Pohled do nitra mikroprocesoru Josef Horálek

Strojový kód, assembler, emulátor počítača

1 Systémová volání (celkem max. 1b)

Assembler - 3.část. poslední změna této stránky: Zpět

Jako pomůcka jsou v pravém dolním rohu vypsány binární kódy čísel od 0 do 15 a binární kódy příkazů, které máme dispozici (obr.21). Obr.

Architektury CISC a RISC, uplatnění v personálních počítačích

Koncepce DMA POT POT. Při vstupu nebo výstupu dat se opakují jednoduché činnosti. Jednotlivé kroky lze realizovat pomocí speciálního HW.

B4B35OSY: Operační systémy

Úroveň strojového kódu 32-bitový procesor Intel Pentium

Opakování programování

IMTEE Přednáška č. 11

EAX. segment O O O O offset

Úroveň strojového kódu procesor Intel Pentium Zásobník a konvencie volania

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Architektury počítačů a procesorů

Čísla, reprezentace, zjednodušené výpočty

Procesory, mikroprocesory, procesory na FPGA O. Novák, CIE 11 1

Operační systémy a programování

Struktura programu v době běhu

Exploitace zranitelností. Obsah

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce

Úroveň strojového kódu procesor Intel Pentium. Adresovanie pamäte

Registry 8*32bit ERn (=16*16bit En+Rn, 8*16bit+16*8bit En+RnH+RnL)

Struktura a architektura počítačů (BI-SAP) 8

Architektura procesoru ARM

MIDAM UC 301 modbus regulátor topeni, otočné tlačítko, RTC, 2xDO, 1x DI, externí odporové čidlo PT1000, RS485

MCP BIOS řídicí jednotky Kit386EXR

RISC a CISC architektura

Algoritmizace a programování

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE

MSP 430F1611. Jiří Kašpar. Charakteristika


V 70. letech výzkumy četnosti výskytu instrukcí ukázaly, že programátoři a

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Přednáška. Strojový kód a data. 4. Přednáška ISA J. Buček, R. Lórencz

Platforma x64 a přechod na 64 bitů. Aleš Keprt Univerzita Palackého, Olomouc

Vlákna Co je to vlákno?

CHARAKTERISTIKA PROCESORU PENTIUM První verze:

Procesor. Základní prvky procesoru Instrukční sada Metody zvýšení výkonu procesoru

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Lojza - návrh a realizace µprocesoru

Transkript:

REbejs 1. workshop (draft0)

Pojetí workshopu 1 14 dní Rychle a prakticky Teorie až později Podrobný slidy s klikacíma URL ke stažení na wiki Trochu ARM Crackme: jednoúčelový program pro reverzování, bez toho postrádá smysl Poděkování RubberDuckovi

Podklady wiki.base48.cz/rebejs Nebojte se reverzního inženýrství I. Nebojte se reverzního inženýrství II. Nebojte se reverzního inženýrství III. x86asm.net/links ref.x86asm.net/coder32.html ref.x86asm.net/coder64.html

1. workshop - témata RubberDuckův seriál první tři díly + opkódy instrukcí + x64 + x64 verze crackme #1: crackme1_x64.zip

1. workshop - nástroje 32bitový debugger OllyDbg OllyDbg 2.01 64bitový debugger x64dbg x64dbg snapshot_2016-01-21_02-44

Crackme #1 by RubberDuck

OllyDbg crackme1.exe

crackme1.exe 1. instrukce MOV 00401000 B8 00000000 MOV EAX, 0 1. sloupec virtuální adresa 00401000 2. sloupec operační kód opcode B8 00000000 3. sloupec instrukce MOV EAX, 0 OllyDbg disassembler: Intel syntax, MASM příchuť OllyDbg AT&T syntaxe: MOVL $0, %EAX

1. instrukce podrobně B8 00000000 MOV EAX, 0 Mnemonic MOV Cílový 32bitový operand EAX Zdrojový 32bitový operand 0x0 Jednobajtový primární opkód 0xB8 ref.x86asm.net/coder32.html#xb8 Skupina opkódů B8+r MOV r16/32, imm16/32 32bitová konstanta 0x00000000 Intel jí říká immediate value

IA-32 general-purpose registers Osm 32bitových všeobecných registrů, kód 0-7 (3 bity) EAX ECX EDX EBX ESP EBP ESI EDI 0 1 2 3 4 5 6 7

General-purpose registers - příklady EAX = 44332211 32 bitů, velikost DWORD AX: 2211 16 bitů, velikost WORD AL: 11 dolních 8 bitů, velikost BYTE AH: 22 horních 8 bitů, velikost BYTE EBP = 40302010 BP: 2010 Horní WORD nemá název a nejde ho adresovat Pozn. 4 bitům (půlbajt) se říká nibble

Crackme1.exe 2. instrukce CMP 00401005 83F8 01 CMP EAX, 1 Mnemonic CMP Cílový 32bitový operand EAX Zdrojový 32bitový operand 0x1 Jednobajtový primární opkód 0x83 ref.x86asm.net/coder32.html#x83 Skupina opkódů 83 ModR/M byte F8 = 11111000bin zatím to víc neřešíme 8bitová přímá (immediate) hodnota 0x01

Skupina opkódů 0x83 Osm aritmetických a logických instrukcí Operandy: r/m16/32, imm8 Viz taky opkódy 80, 81

2. instrukce podrobně CMP: compare two operands CMP nemění žádný operand Operace CMP = operace SUB SUB: subtract two operands SUB EAX, 1: EAX = EAX - 1 CMP nastavuje šest stavových příznaků (status flags): CF, PF, AF, ZF, SF, OF Viz instrukční reference: Příznaky jsou uloženy v registru EFlags

Registr EFlags, operace CMP Šest stavových příznaků v bitech 0, 2, 4, 6, 7 a 11 Hromada jiných, ty teď neřešíme CMP nastaví ZF (Zero Flag), pokud mají operandy stejnou hodnotu Stejně jako SUB nastaví ZF, pokud je výsledek odečítání nula

crackme1.exe 3. instrukce JE 00401008 74 0C JE SHORT 00401016 Jednobajtový primární opkód 0x74 ref.x86asm.net/coder32.html#x74 Mnemonic JE: Jump if Equal Mnemonic JZ: Jump if Zero SHORT znamená skok v rozmezí -128 a +127 bajtů Skupina opkódů 70-7F: 16 podmíněných skoků Jcc 8-bit relative offset 0x0C Relativní offset se přičítá k registru EIP

3. instrukce JE a reg. EIP podrobně EIP: Instruction Pointer Register EIP obsahuje virtuální adresu následující instrukce, tzn. v době spouštění instrukce JE je EIP 40100A Operace: if (ZF == 1) EIP = EIP + sign extended rel8 Kalkulace návěští (label) skoku: adresa instrukce JE je 401008, je dlouhá 2 bajty: 401008 + 2 + 0C = 401016

crackme1.exe 4. instrukce MOV 0040100A B8 14304000 MOV EAX, OFFSET 00403014 Viz 1. instrukce MOV OFFSET: MASM příchuť, důsledek analýzy OllyDbg rozeznal, že jde o adresu, ne o nahodilou hodnotu Na adrese 403014 je řetězec "Please patch me! :("

crackme1.exe 5. instrukce MOV 0040100F B9 30000000 MOV ECX, 30 Viz 1. instrukce MOV Připomenutí: opkód B9 = B8+r, kód ECX je 1

crackme1.exe 6. instrukce JMP 00401014 EB 0A JMP SHORT 00401020 ref.x86asm.net/coder32.html#xeb: JMP rel8 Mnemonic JMP: Unconditional Jump SHORT znamená skok v rozmezí -128 a +127 bajtů 8-bit relative offset 0x0A Relativní offset se přičítá k registru EIP Kalkulace návěští skoku: 401014 + 2 + 0A = 401020

crackme1.exe 9. instrukce PUSH 00401020 51 PUSH ECX ref.x86asm.net/coder32.html#x50: 50+r PUSH r16/32 Skupina opkódů 50-57 Uloží hodnotu operandu na zásobník ve dvou krocích: ESP = ESP 4 *ESP = ECX Zásobník je zatím prostě nějaká paměť, víc to neřešíme OllyDbg: zásobník je vidět vpravo dole

Parametry WinAPI MessageBoxA() Prototyp funkce z MSDN: int WINAPI MessageBox( _In_opt_ HWND hwnd, _In_opt_ LPCTSTR lptext, _In_opt_ LPCTSTR lpcaption, _In_ UINT utype );

Parametry WinAPI MessageBoxA() Odpovídající instrukce PUSH 51 PUSH ECX ; utype 68 28304000 PUSH OFFSET 403028 ; lpcaption 50 PUSH EAX ; lptext 6A 00 PUSH 0 ; hwnd

Volací konvence stdcall Konvence je vidět v prototypu: int WINAPI MessageBox(); WinDef.h (Windows SDKs): #define WINAPI stdcall MSDN stdcall calling convention Parametry jsou uložené zprava doleva Zásobník čistí volaná funkce Návratová hodnota je v registru EAX Registry EAX, ECX a EDX může volaná funkce změnit, ostatní musí zachovat stdcall používá většina WinAPI funkcí

Další formy instrukce PUSH PUSH immediate value: buď 32bitová hodnota, nebo znaménkově rozšířený imm8 na 32 bitů 68 28304000 PUSH OFFSET 403028 6A 00 PUSH 0

crackme1.exe 13. instrukce CALL 00401029 E8 0E000000 CALL <jmp.&user32.messageboxa> Trochu jinak: CALL 0040103C Jednobajtový primární opkód E8 CALL rel16/32 Operace: PUSH EIP JMP 0040103C Tento CALL volá MessageBoxA() nepřímo přes JMP umístěný na konci kódu, je to záležitost importování funkcí a assembleru MASM, toto teď neřešíme

Volání funkce: pár CALL - RET CALL func... func:... RET ; taky RETN Operace CALL: ESP = ESP 4 *ESP = EIP JMP func Operace RET: EIP = *ESP ESP = ESP + 4

OllyDbg: základní akce Step into (klávesa F7): dojde k přechodu na návěští CALL Step over (klávesa F8): krokování pokračuje až po návratu z CALL Run (klávesa F9): spustí debugovaný program, tzn. nekrokuje ho Restart (Ctrl+F2): zabije aktuální sešn a načte debugovaný program znovu; dobrá věc, pokud krokováním dojdu donikam a potřebuju začít znovu

Disassembling MessageBoxA() 8BFF mov edi, edi 55 push ebp 8BEC mov ebp, esp 6A 00 push 0 FF75 14 push dword ptr [ebp+14] FF75 10 push dword ptr [ebp+10] FF75 0C push dword ptr [ebp+0c] FF75 08 push dword ptr [ebp+8] E8 A0FFFFFF call MessageBoxExA 5D pop ebp C2 1000 retn 10

MessageBoxA(): RETN 10 C2 1000 RETN 10 0x10 = 16 16/4 = 4 DWORD parametry Pseudooperace: ESP = ESP + 16 EIP = *ESP ESP = ESP + 4

crackme1.exe 15. instrukce CALL 00401030 E8 01000000 CALL <jmp.&kernel32.exitprocess> Trochu jinak: CALL 00401036 Viz předchozí instrukce CALL Jde o ukončení procesu: funkce ExitProcess() v knihovně kernel32.dll I když nikdy nedojde k návratu, stejně se použivá CALL a ne JMP

OllyDbg assembler Assembluj MOV EAX, 5 na adrese 401000 (= EIP)

OllyDbg assembler Např. nekonečná smyčka instrukce MOV, SUB a JMP: 1. Assembluj MOV EAX, 5 na adrese 401000 (= EIP) 2. Assembluj SUB EAX, 1 na adrese 401005 3. Assembluj JMP 401005 na adrese 401008 Změny se obarví červeně, super věc na učení se opkódů

Instrukce INT3; NOP; ADD [EAX], AL CC INT3 Výplň kódu (i dat) na místech, kam se nemá dostat řízení Způsobí ladící výjimku; tu teď neřešíme 90 NOP No OPeration Výplň pro zarovnání kódu 0000 ADD [EAX], AL Podezřelá instrukce Inicializační hodnota při alokaci paměti, nejde o kód

Shrnutí pojmů (1) Virtuální adresa Opkód, primární opkód Mnemonic instrukce Operand instrukce Intel syntaxe vs. AT&T syntaxe Osm všeobecných registrů Velikosti: DWORD, WORD, BYTE Orientace v primárních opkódech Registr EFlags, šest stavových příznaků, příznak ZF Registr EIP, kalkulace návěští skoku Volací konvence stdcall

Shrnutí pojmů (2) Volání funkce: CALL RET Odstraňování parametrů ze zásobníku pomocí RET OllyDbg assembler

Shrnutí instrukcí MOV CMP, SUB JE, Jcc JMP PUSH CALL INT3 NOP ADD [EAX], AL

Problémy s označením architektury Hromada zjednodušujících názvů pro komplikovanou architekturu: Intel IA-32 architecture Intel64 architecture (nový 64-bit mode ) AMD64 architecture x86 architecture, legacy mode 64-bit x86 architecture (nový Long Mode ) Microsoft x86 x64

Crackme #1 (x64) by RubberDuck

x64dbg crackme1_x64.exe

crackme1_x64: 1. instrukce SUB 000000013FC0100 48 83 EC 08 SUB RSP, 8 Vypadá jako alokace 8 bajtů na zásobníku Ve skutečnosti zarovnání zásobníku na 16 bajtů, vynucené volací konvencí (viz následující slajdy) Komplikace při programování v assembleru Jednobajtový primární operační znak 0x83 ref.x86asm.net/coder64.html#x83 Nová věc: prefix 48 REX.W ref.x86asm.net/coder64.html#x48 Nejčastější REX.W zvětší velikost operandu na 64 bitů REX prefixy na x86 neexistují

64-bit registers Šestnáct 64bitových všeobecných registrů, kód 0-15 (4 bity) RAX RCX RDX RBX RSP RBP RSI RDI 0 1 2 3 4 5 6 7 R8 R9 R10 R11 R12 R13 R14 R15 8 9 10 11 12 13 14 15 64bitový instrukční ukazatel RIP

64-bit general-purpose registers RAX = 8877665544332211, velikost QWORD EAX: 44332211 AX: 2211 AL: 11 AH: 22 RSP ESP SP SPL RBP EBP BP BPL RSI ESI SI SIL RDI EDI DI DIL R15 - R15D - R15W - R15B Horní DWORD nejde adresovat a nemá název

crackme1_x64: 5. instrukce MOVABS 000000013FC0100 48 B8 1430C03F01000000 MOVABS RAX, 13FC03014 Jednobajtový primární opkód 0xB8 Prefix 48 REX.W Mnemonic MOVABS neexistuje, jde o MOV lidová tvořivost, odpovídá to správnějšímu OFFSET v OllyDbg

crackme1_x64: volání MessageBoxA Předávání parametrů je zhruba vidět: SUB RSP, 20 MOV RCX, 0 MOV RDX, RAX ; hwnd ; lptext MOVABS R8, 13FC03028 ; lpcaption MOV R9, RBX ; utype CALL <crackme1_x64.messageboxa> ADD RSP, 20 První 4 parametry jdou vždycky do registrů RCX, RDX, R8 a R9 Ale co ten SUB/ADD RSP, 20?

Volací konvence fastcall (1) Pozor, nejde o x86 fastcall, i když je podobný Ještě jednou, konvence bývá vidět v prototypu: int WINAPI MessageBox(); WinDef.h (Windows SDKs): #define WINAPI tentokrát je to prázdná hodnota, všechno je fastcall (s výjimkami) MSDN x64 fastcall calling convention První 4 parametry jdou vždycky do registrů RCX, RDX, R8 a R9, ostatní na zásobník Zásobník čistí volaná funkce Návratová hodnota je v registru RAX Registry RAX, RCX, RDX, R8, R9, R10 a R11 může volaná funkce změnit, ostatní musí zachovat

Volací konvence fastcall (2) První 4 parametry jsou v registrech, ale na zásobníku musí být tak jako tak alokovaný prostor, další jdou na zásobník jako u stdcall Alokace a uvolnění 4 parametrů pomocí SUB/ADD RSP, 20 0x20 = 32 = 4*8

fastcall a zarovnání zásobníku MSDN: The stack will always be maintained 16-byte aligned Vstupní bod programu je vlastně vstupní bod funkce main() Volání funkce zruší zarovnání na 16 bytů: 1. Před provedením CALL je zásobník zarovnaný na 16 bytů 2. CALL provede PUSH RIP (8 bytů) 3. Na vstupu do funkce je potřeba zásobník znovu zarovnat pomocí SUB RSP, 8

crackme1_x64: volání ExitProcess ExitProcess() má jenom jeden parametr, ale na zásobníku je potřeba vždycky alokovat 4 parametry: SUB RSP, 20 ; 4*QWORD MOV ECX, 0 CALL crackme1_x64.rtlexituserprocess

Shrnutí pojmů (x64) 16 64bitových všeobecných registrů 64bitová virtuální paměť, registr RIP Velikost QWORD Volací konvence fastcall Zarovnání zásobníku Prefixy REX

Domácí úkoly 1. Crackněte crackme1 (x86 i x64) podle návodu v článku Nebojte se reverzního inženýrství I. 2. Crackněte crackme1 ještě jinak než podle návodu 3. Pokud v crackme1 změníte instrukci CMP na SUB, jaký vliv to bude mít na funkčnost programu? 4. Přepište crackme1 do vyššího jazyka podle vašeho výběru 5. Vytvořte přímo v OllyDbg assembleru co nejkratší kód, který způsobí vyčerpání paměti zásobníku