002 Opcode Strony projektu:

Podobne dokumenty
PROGRAMOWANIE NISKOPOZIOMOWE

Architektura komputerów

PROGRAMOWANIE NISKOPOZIOMOWE. Systemy liczbowe. Pamięć PN.01. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Programowanie Niskopoziomowe

Programowanie Niskopoziomowe

Programowanie w asemblerze Środowiska 64-bitowe

CPU. Architektura FLAGS Bit: dr Paweł Kowalczyk; DPTNS, KFCS UŁ. SI 16 bit. 16 bit. 16 bit.

PODSTAWOWE ELEMENTY ASEMBLERA TRYBY ADRESOWANIA. OPERATORY ASEMBLERA

Metody Realizacji Języków Programowania

Załącznik do ćwiczenia w środowisku MASM32 Przesyłanie danych i zarządzanie danymi

Programowanie w asemblerze Środowiska 64-bitowe

PROGRAMOWANIE NISKOPOZIOMOWE. Adresowanie pośrednie rejestrowe. Stos PN.04. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Architektura systemów komputerowych. Lista instrukcji procesora

Lista Rozkazów: Język komputera

Wstęp do informatyki. Architektura co to jest? Architektura Model komputera. Od układów logicznych do CPU. Automat skończony. Maszyny Turinga (1936)

end start ; ustawienie punktu startu programu i koniec instrukcji w assemblerze.

Architektura komputerów. Komputer Procesor Mikroprocesor koncepcja Johna von Neumanna

Architektura komputerów

Przepełnienie bufora i łańcuchy formatujace

Programowanie Niskopoziomowe

Ćwiczenie nr 6. Programowanie mieszane

INSTRUKCJE Instrukcje przeniesienia: Instrukcje konwersji: Arytmetyczne instrukcje:

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

Cel wykładu. Przedstawienie działania exploitów u podstaw na przykładzie stack overflow.

Procesory rodziny x86. Dariusz Chaberski

Metody Realizacji Języków Programowania

Architektura typu Single-Cycle

J. Duntemann Zrozumieć Assembler Leo J. Scanlon Assembler 8086/8088/80286 S. Kruk Programowanie w Języku Assembler

Architektura komputerów

Adam Kotynia, Łukasz Kowalczyk

Ćwiczenie 3. Konwersja liczb binarnych

Materiały do wykładu. 7.Architekturax86. Marcin Peczarski. Instytut Informatyki Uniwersytet Warszawski

Rozszerzalne kody operacji (przykład)

UTK ARCHITEKTURA PROCESORÓW 80386/ Budowa procesora Struktura wewnętrzna logiczna procesora 80386

. III atyka, sem, Inform Symulator puterów Escape rchitektura kom A

Błędy łańcuchów formatujących (format string) by h07

Programowanie w asemblerze Architektura procesora

Optymalizacja wykonania programów sekwencyjnych. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

Programowanie w asemblerze Uruchamianie programów

Architektura komputerów

2 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.02 Rok akad. 2011/ / 24

Programowanie niskopoziomowe

PROGRAMOWANIE NISKOPOZIOMOWE. Struktury w C. Przykład struktury PN.06. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

WOJSKOWA AKADEMIA TECHNICZNA

Załącznik do ćwiczenia w środowisku MASM32 wersji 10 Sterowanie przebiegiem wykonania programu

Programowanie Niskopoziomowe

Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania.

Budowa wnętrza procesora x86

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Programowalne układy logiczne

PROGRAMOWANIE NISKOPOZIOMOWE

Programowanie w asemblerze Wprowadzenie

Układ wykonawczy, instrukcje i adresowanie. Dariusz Chaberski

Kod hex Instrukcja Opis 37 AAA Koryguj AL po dodawaniu BCD

Architektura komputerów

Programowanie na poziomie sprzętu. Tryb chroniony cz. 1

Programowanie hybrydowe łączenie C/C++ z asemblerem

Procesory rodziny Intel

Architektura komputerów. Asembler procesorów rodziny x86

Asembler. Æwiczenia praktyczne

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

Architektura komputerów

CPU ROM, RAM. Rejestry procesora. We/Wy. Cezary Bolek Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Ćwiczenie nr 4. Zasady kodowania podprogramów

Bibliografia: pl.wikipedia.org Historia i rodzaje procesorów w firmy Intel

Tryb rzeczywisty to tryb pracy mikroprocesorów z rodziny procesorów x86, w którym procesor pracuje tak jak procesor Intel 8086.

Shellcody a architektura MIPS na systemach IRIX. Adam Zabrocki.

Architektura systemów komputerowych. Konstrukcja i zasada działania mikroprocesora

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

Sprzętowe wspomaganie pamięci wirtualnej

Konieczne odwzorowanie (mapping) obiektów: nazwa (+indeks) adres lokacja

ARCHITEKTURA PROCESORA,

Programowanie niskopoziomowe

Architektura Systemów Komputerowych

Architektura Systemów Komputerowych

Materiały do wykładu. 4. Mikroprocesor. Marcin Peczarski. Instytut Informatyki Uniwersytet Warszawski

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

Struktura stanowiska laboratoryjnego

Organizacja typowego mikroprocesora

Buffer Overflow (art. 2) by h07

Architektura typu multi cycle

2 Przygotował: mgr inż. Maciej Lasota

Programowanie hybrydowe C (C++) - assembler. MS Visual Studio Inline Assembler

1. Asembler i wstawki asemblerowe w C

Floating Point Unit Koprocesor umożliwia działania na liczbach ułamkowych (zmiennoprzecinkowych) 8 rejestrów 80-bitowych: st0,,st7 Typy danych

Wprowadzenie do tworzenia kodów powłoki w systemie Linux. by h07 (h07@interia.pl)

J. Ułasiewicz Komputerowe systemy sterowania 1. 1 Architektura PC Ogólna struktura systemu jednoprocesorowego

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

1: ////////// 2: // test.c. 3: ssize_t ret = read(fd, buf, nbytes);

Praktycznie całe zamieszanie dotyczące konwencji wywoływania funkcji kręci się w okół wskaźnika stosu.

Return-oriented exploiting

Programowanie w asemblerze Optymalizacja

organizacja procesora 8086

Wskaźniki. Informatyka

Wybrane zagadnienia elektroniki współczesnej

Programowanie w asemblerze Obliczenia zmiennopozycyjne

Argumenty wywołania programu, operacje na plikach

Transkrypt:

ReverseCraft assem bler by gynvael.coldwind//vx Opcode Strony projektu: http://re.coldwind.pl/ http://www.uw-team.org/

Zasoby! czyli co możemy użyć... Instrukcje procesora Pamięć Wirtualna Rejestry CPU Ext. OS Stack Heap... Biblioteki OS API

Instrukcje procesora mov eax, 45678h mnemonic??? opcode B8 78 56 4

Instrukcje procesora Dla wszystkich: - opcode'y, prefixy, imm - co można dać w [ ] - jak czytać opcodes.txt :) Dla dociekliwych: - jak dokładnie zbudowany jest opcode - co zawiera ModRM i SIB - jak wygląda mapa opcode'ów

Instrukcje procesora (opcodes.txt/pentium.txt)??????args??? 89 /r MOV r/m,r Move opcode mnemonic opis

Instrukcje procesora (opcodes.txt/pentium.txt) /r -- Indicates that the ModR/M byte of the instruction contains both a register operand and an r/m operand.???args??? 89 /r MOV r/m,r Move opcode mnemonic opis

Instrukcje procesora (Intel Manual, Vol a, rozdział.) -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. od do 6 bajtów

Instrukcje procesora (Intel Manual, Vol a, rozdział.) -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. unikatowy identyfikator polecenia procesora Przykłady poleceń: 6 - PUSHAD 9 - NOP 9 - XCHG EAX, EAX 6 - POPAD C - RET D9 FE - FSIN

Jak wyglądają opcode'y (Intel Manual, Vol b, dodatek A i B) Uproszczona mapa opcode'ów -FF oprócz poniższych wyjątków, to pojedyncze instrukcje, prefiksy oraz grupy instrukcji z indexem w MODR/M Wyjątki D8-DF to ucieczka do instrukcji koprocesora (FPU) F to ucieczka do rozszerzonego zestawu instrukcji, podobnie jak sekwencje: 66 F F F F F 66 F

Jak wyglądają opcode'y (Intel Manual, Vol b, dodatek A i B) C - RET 4+rd - INC rejestr rd = (EAX =, ECX, EDX, EBX, ESP, EBP, ESI, EDI) 4 - INC EAX 4 - INC EDX 47 - INC EDI C - grupa opcode'ów:??? C / ib - ROL r/m8, imm8 C / ib - ROR r/m8, imm8... C /7 ib - SAR r/m8, imm8

Jak wyglądają opcode'y (Intel Manual, Vol b, dodatek A i B) D8 numer_instrukcji_koprocesora lub MODR/M D8 / - FADD mreal D8 D - FCOM D8 D9 - FCOMP Escape prefix F F BE /r - MOVSX r,r/m8 F BF /r - MOVSX r,r/m6 (B8+rd - MOV r,imm) 66 F A F - PALIGNR xmm, xmm/m8, imm8

Jak wyglądają opcode'y (Intel Manual, Vol b, dodatek A i B) D8 numer_instrukcji_koprocesora lub MODR/M D8 / - FADD mreal D8 D - FCOM D8 D9 - FCOMP Escape prefix F F BE /r - MOVSX r,r/m8 F BF /r - MOVSX r,r/m6 (B8+rd - MOV r,imm) 66 F A F - PALIGNR xmm, xmm/m8, imm8

Jak wyglądają opcode'y (Intel Manual, Vol b, dodatek A i B) // 6 - PUSHAD, 9 - NOP, 6 - POPAD, C - RET #include <stdio.h> int main(void) { char *func_code = \x6\x9\x6\xc ; void (*func_ptr)(void) = (void(*)(void))func_code; func_ptr(); } return ;

Instrukcje procesora (Intel Manual, Vol a, rozdział.) -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. Przykłady poleceń: B8+rd - MOV r,imm np. B8 78 56 4 to MOV EAX, x45678!little ENDIAN! stała (liczba) / natychmiastowa / bezpośrednia (immediate)

Little big endian Little endian (X86) Big endian (SPARC) B8 78 56 4 78 56 4 EAX: 4 56 78 REG: 78 56 4

Program cd... // B8+rd imm - MOV rd, imm ; C - RET #include <stdio.h> int main(void) { char *func_code = "\xb8\x78\x56\x4\x\xc"; int (*func_ptr)(void) = (int(*)(void))func_code; printf("%x\n", func_ptr()); } return ;

Instrukcje procesora (Intel Manual, Vol a, rozdział.) -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. 4 grupy prefixów: prefiksy zmieniające działanie instrukcji. Lock and repeat. Segment override / branch hint. Operand-size override 4. Address-size override

Instrukcje procesora 4 grupy prefixów:. Lock and repeat F - LOCK, F - REPNE/REPNZ, F - REP or REPE/REPZ. Segment override / branch hint E - CS, 6 - SS, E - DS, 6 - ES, 64 - FS, 65 - GS E - branch not taken, E - branch taken. Operand-size override (and espace) 66 - Operand-size override prefix 4. Address-size override 67 - Address-size override prefix

Instrukcje procesora 4 grupy prefixów: 66 - Operand-size override prefix operand bity <-> operand 6 bitów B8 78 56 4 - MOV EAX, x45678 66 B8 4 - MOV AX, x4 rejestr -bitowy (EAX) -> rejestr 6-bitowy (AX) stała -bitowa -> stała 6-bitowa

prefiksy zmieniające działanie instrukcji -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. Mod Reg / Op R/M [REG] EAX EAX [REG+disp8] ECX ECX [REG+disp] EDX EDX REG EBX EBX ESP SIB/ESP 4 EBP disp/ebp 5 ESI ESI 6 EDI EDI 7

C7 / id MOV r/m,imm Opcode = C7 ModR/M = ( Mod=?? Op= R/M=??? ) C7 C 44 -> MOV ECX, x44 C = = ( Mod= Op= R/M= ) C7 44 -> MOV [ECX], x44 = = ( Mod= Op= R/M= ) Mod Reg / Op R/M [REG] EAX EAX [REG+disp8] ECX ECX [REG+disp] EDX EDX REG EBX EBX ESP SIB/ESP 4 EBP disp/ebp 5 ESI ESI 6 EDI EDI 7

8B /r MOV r,r/m 89 /r MOV r/m,r 8B -> MOV EAX, [EAX] 89 -> MOV [EAX], EAX = ( Mod=, Reg=, R/M= ) ( [REG] EAX EAX ) Mod Reg / Op R/M [REG] EAX EAX [REG+disp8] ECX ECX [REG+disp] EDX EDX REG EBX EBX ESP SIB/ESP 4 EBP disp/ebp 5 ESI ESI 6 EDI EDI 7

8B /r MOV r,r/m 8B C -> MOV EAX, EAX 89 /r MOV r/m,r 89 C -> MOV EAX, EAX Kodowanie MOV EAX, EAX Kodowanie MOV EAX, IMM B8+rd MOV r,imm B8 IMM -> MOV EAX, IMM C7 / id MOV r/m,imm C7 C IMM -> MOV EAX, IMM

offset, przesunięcie -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. Mod Reg / Op R/M [REG] [REG+disp8] [REG+disp] REG EAX ECX EDX EBX ESP EBP ESI EAX ECX EDX EBX SIB/ESP disp/ebp ESI 4 5 6 MOV EAX, [EAX+x45678] 8B 8 78 56 4 Mod= Reg= R/M= MOV EAX, [x45678] 8B 5 78 56 4 MOV EAX, [x45678] A 78 56 4 EDI EDI 7

rozszerzona notacja adresu (tablice!) -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. Mod Reg / Op R/M [REG] EAX EAX [REG+disp8] ECX ECX [REG+disp] EDX EDX REG EBX EBX ESP SIB/ESP 4 EBP DISP/EBP 5 ESI ESI 6 EDI EDI 7

rozszerzona notacja adresu (tablice!) -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. Mod Scale Index Base [Base + Index*Scale] = EAX EAX [Base + Index*Scale + disp8] = ECX ECX [Base + Index*Scale + disp] = 4 EDX EDX REG = 8 EBX EBX MOV EAX, [EBX+ECX*4 + x45678] MOV EAX, [ESP+] LEA EAX, [ECX+ECX*8 + x4] none EBP ESI EDI ESP Mod= -> disp Mod=/ -> EBP ESI EDI 4 5 6 7

Mod Scale Index Base [Base + Index*Scale] = EAX EAX [Base + Index*Scale + disp8] = ECX ECX [Base + Index*Scale + disp] = 4 EDX EDX REG = 8 EBX EBX none ESP 4 Zabawa w disassembler! EBP ESI Mod= -> disp Mod=/ -> EBP ESI 5 6 EDI EDI 7 8B 84 8B 78 56 4 Co to za instrukcja?

Mod [Base + Index*Scale] [Base + Index*Scale + disp8] [Base + Index*Scale + disp] REG Zabawa w disassembler! Scale Index Base = = = 4 = 8 8B 84 8B 78 56 4 EAX ECX EDX EBX none EBP ESI EDI EAX ECX EDX EBX ESP Mod= -> disp Mod=/ -> EBP ESI EDI 4 5 6 7 Opcode = 8B /r MOV r, r/m ModR/M = 84 = (Mod= Reg= R/M=) [+disp] EAX SIB SIB = 8B = (Scale= Index= Base=) =4 ECX EBX Końcowa postać: MOV EAX, [EBX + ECX*4 + x45678]

Podsumowanie - pełna instrukcja w kodzie maszynowym ma od do 6 bajtów - instrukcja dzieli się na 6 pól Prefixes Opcode ModR/M SIB Disp. Imm. - jakie warianty danego mnemonika mogą być zakodowane można zobaczyć w opcodes.txt/pentium.txt oraz w manualach - niektóre instrukcje można zakodować na więcej niż jeden sposób

Podsumowanie - adres w nawiasie [ ] może być złożony z: [rejestru] [rejestru + przesunięcia] [bazy + indeksu*skala] [bazy + indeksu*skala + przesunięcia] [indeksu*skala + przesunięcia] [przesunięcia] innych opcji nie ma - przesunięcie to stała (liczba) 8 lub bitowa

Podsumowanie - z uwagi na budowę instrukcji, nie jest możliwe zapisanie w instrukcji dwóch dereferencji adresu (tj. dwóch członów w [ ]) - prefiksy m.in. umożliwiają przejście między a 6 bitową wielkością operandu - opcodes.txt jest proste i przydatne :)

Eksperymenty domowe - co się stanie jeżeli przed opcode wstawimy dwa prefiksy zmieniające wielkość operandu?

Co dalej? - prefix zmieniający tryb adresowania z -bitowego na 6-bitowe zmienia działanie bajtu ModR/M, sprawdź jak - sprawdź jakie są rodzaje innych argumentów jakie przyjmują opcode'y (tj. innych niż r, r/m i imm) - jakiego rodzaju argumenty przyjmują skoki?

Dziękuje za uwagę :) Strony projektu: http://re.coldwind.pl/ http://www.uw-team.org/