U23 Assembler Workshop

Ähnliche Dokumente
x86 Assembler Praktische Einführung Sebastian Lackner Michael Müller 3. Juni 2013

Karlsruher Institut für Technologie

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2012 / Vorlesung 9, Dienstag 18.

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015

Betriebssystembau. 7. Übung. Michael Engel Arbeitsgruppe Eingebettete Systemsoftware. Lehrstuhl für Informatik 12 TU Dortmund

Einführung in (Intel) 80x86 Assembler. Einführung in (Intel) 80x86 Assembler Wintersemester 2008/09 1 / 26

COMPILER & CODE ANALYSE. Eine Einführung in die Code Analyse auf Grundlage von Compilern und deren Optimierung. 1

Instruktionssatz-Architektur

Assembler-Programmierung

Buffer Overflow 1c) Angriffsstring: TTTTTTTTTTTTTTTT (16x) Beachte: Padding GCC-Compiler Zusatz: gcc O2 verhindert hier den Angriff (Code Optimierung)

3 Assembler- und Maschinenbefehle, Programmablauf-Steuerung

Die Mikroprogrammebene eines Rechners

Grundlagen der Rechnerarchitektur

Compilerbau Instruktionsauswahl 168. Instruktionsauswahl

Kap 4. 4 Die Mikroprogrammebene eines Rechners

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

Lösungsvorschlag zur 9. Übung

GCC 3.x Stack Layout. Auswirkungen auf Stack-basierte Exploit-Techniken. Tobias Klein, 2003 Version 1.0

Übungen zur Vorlesung Systemsicherheit

Grundlagen der Informatik III Wintersemester 2010/2011

IT- Handbuch für Fachinformatiker, 7. Auflage: Text- Lösungen Sascha Kersken

Technische Informatik 2 Adressierungsarten

Deklarationen in C. Prof. Dr. Margarita Esponda

Hardware-Programmierung mit Linux/NASM

DATEN UND BEFEHLSFORMATE, ADDRESSIERUNGSARTEN UND MASCHINEN- PROGRAMMIERUNGSKONZEPTE

TIn 1: Feedback Laboratories. Lecture 4 Data transfer. Question: What is the IP? Institut für Embedded Systems. Institut für Embedded Systems

Was kann ein Assembler?

Funktionaler Aufbau eines Computers Untersuchung von Delphi-Compilaten

Betriebssysteme KU - Einführungstutorium

Stephan Brumme, SST, 2.FS, Matrikelnr

Einführung zum MS Visual Studio

Sicheres C Programmieren in Embedded Systemen ARM II (ARM7TMDI [1] ) Wintersemester

Rechnerarchitektur und Betriebssysteme (CS201): AVR-CPU und -Assembler

Matthias Hanreich - TheGreyKnight

Debuggen mit GDB (Gnu DeBugger) unter Eclipse

Mikrocontroller effektiv in C programmieren - ein noch unbekanntes Land

Propädeutikum. Dipl.-Inf. Frank Güttler

Compiler: Vom Code zum Maschinen-Code. C Programmierung - Vorlesung 2 Hochschule Regensburg Universitätsstraße 31, Regensburg

Mikroprozessoren Grundlagen AVR-Controller Input / Output (I/O) Interrupt Mathematische Operationen

7a. Rechnerarchitektur und Grundzüge der Assemblerprogrammierung

Technische Informatik 1

b) Gegeben sei folgende Enumeration: enum SPRACHE {Deutsch, Englisch, Russisch};

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

0 C (Carry) Überlauf des 8ten Bits. 1 DC (Digit Carry) Überlauf des 4ten Bits. Mnemonic Parameter Beschreibung Status-Flags.

Kompaktkurs C-Programmierung

2 Einfache Rechnungen

Einführung in die C-Programmierung

Zusammenfassung des Handzettels für Programmieren in C

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

Programmierung in C. Grundlagen. Stefan Kallerhoff

Einführung in die Programmiersprache C

Hello world. Sebastian Dyroff. 21. September 2009

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester

Betriebssysteme BS-V SS Hans-Georg Eßer. Foliensatz V: Ulix: Interrupts und Faults Ulix: System Calls. Dipl.-Math., Dipl.-Inform.

1.7 Assembler Programmierung

Die Programmiersprache C

Moritz Höppner.

Technische Informatik 2: Addressierung und Befehle

MIKROPROZESSOR PROGRAMMIERUNG 8. VORLESUNG. LV-Nr SS INSTITUT FÜR ELEKTRONIK BIT

B1 Stapelspeicher (stack)

Technische Informatik 2 Maschinenprogrammierungskonzepte

HC680 PROGRAMMER'S REFERENCE MANUAL

Informatik Repetitorium SS Volker Jaedicke

Mikroprozessor als universeller digitaler Baustein

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl

Tutorübung 7: Mikroprogrammierung I

Betriebssysteme Teil 6: Hardware-Schicht II

Modellierung und Programmierung

Microcontroller Kurs Programmieren Microcontroller Kurs/Johannes Fuchs 1

L3. Datenmanipulation

Einführung in die Programmiersprache C und in den C166-Compiler

Informatik I (D-MAVT)

ARM Cortex-M Prozessoren. Referat von Peter Voser Embedded Development GmbH

[E-1] Wolf, Jürgen: C von A bis Z. Galileo Computing, 3. Auflage,

Strukturierte Datentypen und Funktionszeiger

Programmieren in C Teil 3: Mikrocontrollerprogrammierung

Eine Einführung in C-Funktionen

Gegenüberstellung von Assembler- und C-Programmierung

Workshop: ASURO-Programmieren in C

Übungspaket 19 Programmieren eigener Funktionen

Einführung in die Programmierung mit C++

Kapitel 6 Speicherverwaltung Seite 1 zum Teil nach: Silberschatz&Galbin, Operating System Concepts, Addison-Wesley)

Rechnerorganisation 2 TOY. Karl C. Posch. co1.ro_2003. Karl.Posch@iaik.tugraz.at

Modul 122 VBA Scribt.docx

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler

Assembler in C/C++ Programmen

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Assembler und Hochsprachen

Übungspaket 31 Entwicklung eines einfachen Kellerspeiches (Stacks)

Computergrundlagen Programmieren in C

Klausur Grundlagen der Informatik

System Monitoring mit strace. Systemcall tracing

Die Befehle mit dem Ziel IP sind nichts anderes als Sprungbefehle, sie sind unten noch mal aufgeführt.

Objektorientiertes Programmieren für Ingenieure

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

Tutorium Rechnerorganisation

Prinzipieller Grundaufbau eines einfachen C-Programmes

Rechnerarchitektur und Betriebssysteme (CS201): Asm-Programmierung, Stack, Compiler

Modellierung und Programmierung 1

Transkript:

Ike e.v. http://koeln.ccc.de 2016-11-05

Überblick 1 CPU, Assembler Überblick x86 x86 Assembler 2 RAM, Stack, Calling Conventions Stack Calling Conventions Stackframes 3 Branches Jumps 4 Speicher, C-Interface C-Typen main 5 Intel Syntax AT&T vs Intel

1 CPU, Assembler Überblick x86 x86 Assembler 2 RAM, Stack, Calling Conventions Stack Calling Conventions Stackframes 3 Branches Jumps 4 Speicher, C-Interface C-Typen main 5 Intel Syntax AT&T vs Intel

Überblick CPU

Überblick Assembler Opcodes optimiert für Implementierung (CPU) Umsetzen von menschenlesbaren Befehlen zu Opcodes Anweisungen für vorhandene Hardware Nah an der Hardware Arbeiten auf Registern Feste Auswahl an Registern und Operationen Immer abhängig von der Hardware Bezeichnet sowohl den Compiler als auch die Sprache

x86 x86 Architektur (32-Bit) Gewachsener Standard Definierter Befehlssatz (Instruction Set) Definierte Register Mit zusätzlichen Erweiterungen x87 Vektorregister (SSE, AVX, ) AMD64

x86 Register Allgemeine Register eax Akkumulator ebx Basisregister ecx Counterregister edx Datenregister Pointerregister esp Stackpointer ebp Stackbasispointer eip Instruktionspointer Indexregister esi Quellindex edi Zielindex

x86 Register 31 1615 87 0 eax ax ah al Genauso für %ebx, %ecx, %edx. 31 1615 0 esp sp Genauso für %ebp, %esi, %edi.

x86 Assembler ASM Syntax (AT&T) 1 # Kommentare 2 func: # Label (Funktionsname) 3 mov %edx, %eax # Kopiere Wert (move) 4 add %ecx, %eax # Addiere Werte 5 add $5, %eax # Addiere Konstante 6 ret # return Ein Befehl pro Zeile Name zuerst (Mnemonic) Reihenfolge: Quelle, Ziel Register mit Prefix % Konstanten mit Prefix $

x86 Assembler Instruction Set Reference http://www.intel.com/content/dam/www/public/us/en/documents/manuals/ 64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383. pdf Dokumentation aller Instruktionen Auch Parameter und Seiteneffekte

stub.c: 1 #include <stdio.h> 2 3 int func(int, int) attribute ((fastcall)); 4 5 int main(void) 6 { 7 printf("%i\n", func(5, 42)); 8 return 0; 9 } asm.s: 1.global func 2 3 func: 4 mov %edx, %eax 5 add %ecx, %eax 6 add $5, %eax 7 ret

asm.s: 1.global func 2 3 func: 4 mov %edx, %eax 5 add %ecx, %eax 6 add $5, %eax 7 ret 1. Parameter in %ecx 2. Parameter in %edx Rückgabewert in %eax

Führe das Beispielprogramm aus 1 gcc -Wall -m32 -c stub.c 2 gcc -Wall -m32 -c asm.s 3 gcc -m32 -o main stub.o asm.o

Implementiere uint32_t func(uint32_t p1, uint32_t p2) { } return 5; return p1; return p1 - p2; return (p1 << 16) (p2 & 0xffff); return (p1 + p2) ^ (p1 & p2);

Fragen Wofür sind die Register da? Was macht eip? Warum braucht man assembler?

1 CPU, Assembler Überblick x86 x86 Assembler 2 RAM, Stack, Calling Conventions Stack Calling Conventions Stackframes 3 Branches Jumps 4 Speicher, C-Interface C-Typen main 5 Intel Syntax AT&T vs Intel

Stack RAM 1 mov (%ebx), %eax # Zugriff über Pointer 2 mov 8(%ebx), %eax # Zugriff über Pointer mit Displacement 3 4 # Displacement ist 4 * ecx + 8 5 mov 8(%ebx, %ecx, 4), %eax 6 7 # Und in die andere Richtung 8 mov %eax, (%ebx) 9 mov %eax, 8(%ebx) 10 11 # RAM zu RAM geht nicht 12 # mov (%ebx), (%eax)

Stack Stack 0xff1c: top esp 0xff20: 0xff24: 0xff28: 0xff2c: 0xff30: 0xff34: old ebp return address 1. Parameter 2. Parameter ebp Verwendet für Lokale Variablen Funktionsparameter Rücksprungadressen Dedizierter Speicherbereich Wächst von höheren zu niedrigeren Adressen %esp zeigt auf das obere Ende des Stack (Stack Pointer)

Stack Push / Pop Werte auf den Stack schieben / vom Stack holen Push Verringert Stack Pointer, schreibt Wert nach (%esp) Pop Lädt Wert von (%esp), erhöht Stack Pointer 1 push %eax 2 3 pop %eax 1 sub $4, %esp 2 mov %eax, (%esp) 3 4 mov (%esp), %eax 5 add $4, %esp

Calling Conventions Calling Conventions Funktionsaufrufe geben Kontrolle ab Aufgerufene Funktion arbeitet auf derselben Hardware Keine Absicherung / Trennung von Variablen / Werten (Scope) Registerwerte können verändert werden Deshalb definierte Konvention Welche Register dürfen verändert werden? Wie werden Parameter übergeben? Wie wird der Rückgabewert übergeben? Wer räumt die Parameter vom Stack?

Calling Conventions cdecl Calling Convention %eax, %ecx, %edx caller-saved (dürfen von aufgerufenen Funktionen überschrieben werden) Alle anderen Register sind callee-saved (die aufgerufene Funktion muss die Werte speichern und wiederherstellen) Parameter werden, von rechts nach links, auf dem Stack übergeben Rückgabewert in %eax für Integer und Pointer Parameter werden von der aufrufenden Funktion aufgeräumt Normalerweise: Stack ist 16-Byte aligned Zusätzliche Regeln für z.b. Floats

Calling Conventions call Instruktion 1 func2: 2 #... 3 push $0x1 4 # rufe func1(1) auf 5 call func1 6 #... 7 push $0x2 8 # Indirekter Funktionsaufruf 9 call (%eax) 10 #... Legt Rücksprungadresse auf den Stack Gibt Kontrolle an eine andere Funktion ab ret holt Rücksprungadresse vom Stack und gibt Kontrolle an diese Adresse zurück

Stackframes Stackframe 0xff1c: top esp 0xff20: 0xff24: 0xff28: 0xff2c: 0xff30: 0xff34: old ebp return address 1. Parameter 2. Parameter ebp Der Platz auf dem Stack, den eine Funktion benutzt Begrenzt durch %ebp und %esp Muss selbst verwaltet werden Am Anfang der Funktion %ebp aufsetzen Am Ende %ebp und %esp zurücksetzen

Stackframes Stackframe 1 func: 2 enter 0, 0 3 #... 4 leave 5 ret 6 7 # enspricht: 8 func: 9 push %ebp 10 mov %esp, %ebp 11 #... 12 mov %ebp, %esp 13 pop %ebp 14 ret Der Platz auf dem Stack, den eine Funktion benutzt Begrenzt durch %ebp und %esp Muss selbst verwaltet werden Am Anfang der Funktion %ebp aufsetzen Am Ende %ebp und %esp zurücksetzen

Stackframes Lokale Variablen 1 func: 2 push %ebp 3 mov %esp, %ebp 4 # Platz für 4 ints 5 sub $0x10, %esp 6 7 #... 8 9 mov %eax, -4(%ebp) 10 mov -0xc(%ebp), %edx 11 12 #... 13 14 leave # Setzt %esp zurück 15 ret Zuerst Platz für lokale Variablen schaffen (%esp verringern) Dann lokale Variablen und Parameter relativ zu (%ebp) benutzen Damit unabhängig von %esp %ebp muss nicht unbedingt benutzt werden Hilfreich für selbstgeschriebenen assembler

Stackframes Static Variablen 1.data # Was folgt sind Daten 2 mein_int: 3.long 0x02 4 mein_string: 5.string "foobar" 6 7.text # Jetzt wieder Code 8 meine_funktion: 9 enter 0, 0 10 push $mein_string # Adresse 11 call printf 12 mov mein_int, %eax 13 leave 14 ret Label stehen für Adressen Von Funktionen (Code) und Variablen / Daten

Implementiere uint32_t func(uint32_t p1, uint32_t p2) { return 5; return p1; return p1 + p2; return (p1 << 16) (p2 & 0xffff); return (p1 + p2) ^ (p1 & p2); }

Implementiere uint32_t func(uint32_t p1,..., uint32_t p12) { return p1 + p2 +... + p12; } void func(void) { printf("hello World!"); }

Fragen Wofür braucht man den Stack? Was ist / wofür braucht man calling conventions? Was machen enter, leave, call?

1 CPU, Assembler Überblick x86 x86 Assembler 2 RAM, Stack, Calling Conventions Stack Calling Conventions Stackframes 3 Branches Jumps 4 Speicher, C-Interface C-Typen main 5 Intel Syntax AT&T vs Intel

Jumps Jump Springe zu Labeln 1 enter 0, 0 2 jmp end 3 4 # Wird nicht ausgeführt 5 add %ebx, %eax 6 7 end: 8 leave 9 ret 1 enter 0, 0 2 3 # Endlosschleife 4 loop: 5 add %ebx, %eax 6 jmp loop 7 8 # Wird nie ausgeführt 9 leave 10 ret

Jumps Flags FLAGS Register Vordefinierte Flags Anhand derer können Entscheidungen getroffen werden Carry Hardware-Überlauf Zero Ergebnis == 0 Sign Sign-Bit Overflow Logischer Überlauf Werden von logischen / arithmetischen Operationen gesetzt Zum Beispiel add, sub, shifts,

Jumps Conditional Jump 1 # ecx = (eax + ebx == 0) 2 #? 23 : 42 3 4 add %eax, %ebx 5 jz zero_case 6 7 mov $42, %ecx 8 jmp end 9 10 zero_case: 11 mov $23, %ecx 12 13 end: 14 #... Springe nur falls Flag gesetzt ist jz Sprung falls Zero Flag gesetzt

Jumps Schleifen 1 mov $42, %ecx 2 loop: 3 # wird 42 Mal ausgeführt 4 add %eax, %ebx 5 dec %ecx 6 jnz loop 7 8 mov $42, %ecx 9 loop2: 10 # wird 42 Mal ausgeführt 11 add %eax, %ebx 12 loop loop2 Springe solange %ecx ungleich 0 loop Kombiniert herunterzählen und bedingten Sprung

Jumps Vergleiche 1 cmp %eax, %ebx 2 # Sprung falls eax == ebx 3 # 'jump if equal' 4 je some_label cmp führt Subtraktion aus Speichert das Ergebnis nicht Setzt aber die gleichen Flags

Implementiere Fibonacci FizzBuzz

Fragen Was ist der Unterschied zwischen je und jz?

1 CPU, Assembler Überblick x86 x86 Assembler 2 RAM, Stack, Calling Conventions Stack Calling Conventions Stackframes 3 Branches Jumps 4 Speicher, C-Interface C-Typen main 5 Intel Syntax AT&T vs Intel

C-Typen Arrays uint32_t a[6]; 0xab00: 0xab04: 0xab08: 0xab0c: 0xab10: 0xab14: a[0] a[1] a[2] a[3] a[4] a[5] Elemente liegen nacheinander im Speicher

C-Typen Arrays uint16_t a[12]; 0xab00: a[0] a[1] 0xab04: a[2] a[3] 0xab08: 0xab0c: a[4] a[6] a[5] a[7] Elemente liegen nacheinander im Speicher 0xab10: a[8] a[9] 0xab14: a[10] a[11]

C-Typen lea Instruktion 1 # ebx = eax * 4-8 2 lea -8(%eax,4), %ebx 3 4 # ebx = edx + eax * 4-8 5 lea -8(%edx, %eax, 4), %ebx Load Effective Address Berechnet Adresse mit Base Address, Displacement und Multiplier Die Adresse, auf die bei einer mov Instruktion zugegriffen würde Nicht gebunden an Semantik Kann auch als Fused Multiply Add (a = b + c * d) benutzt werden

C-Typen C-Structs Elemente liegen nacheinander im Speicher 1 struct foobar { 2 uint32_t a; 3 float b; 4 uint32_t c[2]; 5 }; 6 7 struct foobar fb; 0xab00: 0xab04: 0xab08: 0xab0c: fb.a fb.b fb.c[0] fb.c[1]

C-Typen Padding C-Typen haben bestimmtes (minimales) Alignment Müssen gepaddet werden um das zu erfüllen Das Alignement eines Structs ist das maximale Alignment der Member

C-Typen Padding 1 struct foobar { 2 uint32_t a; 3 uint8_t b; 4 uint32_t c; 5 uint16_t d; 6 }; 7 8 struct foobar fb; 0xab00: 0xab04: 0xab08: 0xab0c: fb.a fb.b Padding fb.c fb.d Padding

C-Typen C-Strings Arrays von char Nullterminiert char mein_string[] = "Hallo Welt!"; 0xab00: 0xab04: 0xab08: 'H' 'a' 'l' 'l' 'o' ' ' 'W' 'e' 'l' 't' '!' '\0'

main main Funktion 1 main: 2 push %ebp 3 mov %esp, %ebp 4 mov 0xc(%ebp), %ebx 5 mov 0x4(%ebx), %eax 6 push %eax 7 call puts 8 leave 9 ret Entspricht main in C Die gleichen Parameter

Implementiere uint32_t sum_array(size_t size, uint32_t a[]) { uint32_t t = 0; for (size_t i=0; i<size; i++) t += a[i]; return t; }

Schreibe ein Programm in Assembler, dass die argv[1]-te Fibonaccizahl berechnet. die 1 Bits in argv[1] zählt.

Fragen Warum padded man structs am ende?

1 CPU, Assembler Überblick x86 x86 Assembler 2 RAM, Stack, Calling Conventions Stack Calling Conventions Stackframes 3 Branches Jumps 4 Speicher, C-Interface C-Typen main 5 Intel Syntax AT&T vs Intel

AT&T vs Intel Intel Asm Alternative Assembler Syntax Destination Operand zuerst, Source als zweites Register ohne % Konstante Werte ohne $ Zugriff auf RAM mit eckigen Klammern Displacement ist irgendwie hübscher notiert

AT&T vs Intel Syntaxvergleich GAS (AT&T) 1 enter 0, 0 2 mov 8(%ebp), %ecx 3 mov $0, %eax 4 mov $1, %ebx 5 loop1: 6 add %ebx, %eax 7 xor %ebx, %eax 8 xor %eax, %ebx 9 xor %ebx, %eax 10 loop loop1 11 leave 12 ret NASM 1 enter 0, 0 2 mov ecx, [ebp+8] 3 mov eax, 0 4 mov ebx, 1 5 loop1: 6 add eax, ebx 7 xor eax, ebx 8 xor ebx, eax 9 xor eax, ebx 10 loop loop1 11 leave 12 ret

AT&T vs Intel Syntaxvergleich GAS (AT&T) mov 8(%ebp, %eax, 4), %ecx NASM mov ecx, [ebp+eax*4+8]