KB » Computer » x86 assembly programming

x86 assembly programming

    Tweeten

Introductie

Deze pagina wordt het startpunt voor alles over programmeren voor de x86 processor, in assembly language natuurlijk.

Ik ben (7-9-2014) bezig met volgen van een gratis Internet-cursus op dit gebied, en in deze sectie beschrijf ik waar ik (vooral bij de oefeningen) tegenaan loop.


Registers

In de Intel architectuur zijn alle registers 32 bits.

ESP is de stack pointer, EIP de instruction pointer. Die kunnen dus niet voor andere doeleinden worden gebruikt.

EAX, EBX, EDX en EBP zijn normaal gesproken voor algemeen gebruik, hoewel er compilers zijn die EBP wel voor een speciaal doel gebruiken. EBP wijst vaak naar de basis van een stack frame.

De return value van een C++ functie is vaak in EAX, als je uit de functie terugkeert. Daarom zie je na afloop van een terugkeer ook vaak een XOR EAX,EAX instructie, om het register weer op 0 te zetten.

EFLAGS is een register waarin 1-bits vlaggen worden bijgehouden over de status van allerlei operaties. Je moet daarbij denken aan een carry bit (vergelijkbaar met als je 7+8 optelt, en een extra 1 erbij krijgt), een zero bit (was het resultaat van de laatste operatie 0), een signed bit (was het resultaat positief of negatief), een overflow bit (paste het resultaat niet in het beschikbare aantal bits) en een direction bit.

ECX, ESI en EDI zijn soms voor speciale doelen bestemd.


Stack

De stack is een tijdelijk opslag voor variabelen e.d. Nieuwe adressen op de stack zijn doorgaans lager dan voorgaande.

De assembly-instructies die iets doen met de stack zijn POP, PUSH en RET. PUSH zet iets op de stack, en POP haalt er iets af.


Instructies

MOV


Opensecurity x86 cursus

Compileren van C(++)-programma's

Gebruik van gcc en objdump in een Linux-omgeving

Ik ben (nog :-) ) geen Linux-expert, en daardoor loop ik tegen wat obstakels aan.

Hoe krijg je de C sources in je Linux-omgeving?

Ik heb de .ZIP-file van de site op een USB-stick gezet, en vervolgens in de virtuele machine benaderd.

Ik heb de .ZIP-file naar de desktop van Ubuntu gekopiëerd.

Ik heb het programma Terminal gestart, door die naam in te tikken in het zoekvenster dat je krijgt door te klikken op het bovenste icoontje (Search your computer and online sources).

Met het commando cd (change directory) kan je naar een andere locatie navigeren, en met ls -l krijg je een listing van de files in de huidige directory. Hoofdletters zijn belangrijk in Linux!!

Zo ben ik naar de Desktop gegaan, en heb unzip IntroX86CodeOnly.zip gedaan.

Daarna ben ik naar de directory Example2 gegaan, en kon ik beginnen met het werken met de sources.

Tools en commando's in Linux

C-compiler gcc

De C-compiler heet gcc

Het commando in de cursus is
gcc -o output_file_name source_file_name

Vbd.: gcc -o Example2 Example2.c

Disassembler objdump

De normale vorm van het commando is
objdump -d object_file
(object_file is het resultaat van de compilatie).

Als je syntax wilt die vergelijkbaar is met Intel doe je
objdump -d -M intel object_file

Getalletjes bekijken met hexdump

Als je om wat voor reden dan ook hexadecimale getallen wil zien kan je
hexdump -C file
doen (de C staat voor canonical).

xxd

Editor nano

Simpelste gebruik is bv.
nano Example2.c

Een aantal van de commando's die je binnen nano kan gebruiken staan onderaan het scherm (het ^-teken voor een letter staat voor de Ctrl-toets).

GNU debugger gdb

De meest bruikbare vorm is
gdb program_name -x command_file

Het laatste deel kan je weglaten. Vaak zal je echter bij het starten standaard een aantal commando's aan gdb willen meegeven, en die kan je dan in command_file zetten.

Op slide 20 van de 3e file van de cursus staat een serie commando's die je in de command file zou kunnen zetten. Je kan die kopiëren uit de PDF-file, en in de virtuele machine plakken in de editor nano (en wegschrijven met Ctrl+O).

Het belangrijkste gdb-commando is help

Je krijgt dan een lijst met commando's, en kan help-informatie voor 1 specifiek commando (of groep van commando's) opvragen. Bv.: help stack
Etc., etc.

Met het run-commando kan je een programma laten lopen. Je kan het commando afkorten tot r

Als je invoer aan het programma wilt meegeven, zoals in het Example2-programma, doet je dat door de parameters achter het commando op te geven, dus bv. run 3 5

Het start-commando doet een run, nadat het een breakpoint op main heeft gezet.

Het display-commando heeft betrekking op wat er wordt weergegeven als een programma stopt, bv. bij een breakpoint. De meerderheid (alle?) commando's in de command file zijn ook van dit type.

Met info display kan je de uitstaande commando's zien. Ze worden voorafgegaan door een nummer, en met undisplay nummer kan je het betreffende display-commando ongedaan maken.

Met display/format expression kan je nieuwe display-regels actief maken.
format kan van alles zijn, bv. 'x' (hexadecimaal), 'i' (asm instructie), 's' (string), 'b', 'h' of 'w' (byte, halfword of word), gevolgd door een getal (i16 = 16 assembler instructies).

Met help breakpoints krijg je info over alle commando's die aan breakpoints gerelateerd zijn.

Met info b of info breakpoints krijg je informatie over alle breakpoints die actief zijn.

Met break breakpoint_naam
kan je een breakpoint aanmaken. breakpoint_naam kan zowel een adres zijn als een echte naam, als je debugging symbols hebt.

Met stepi voer je 1 instructie per keer uit, en doe je een "step into" subroutines.

Met step voer je 1 source line per keer uit (maar als er geen source beschikbaar is, doe je hetzelfde als het vorige commando).

Het aan de praat krijgen van het bomb-programma

Ik heb de file die je kunt downloaden (bomb.tar) weer via een stick in de Linux-omgeving gekregen.

Je kan de file uitpakken met tar xvf bomb.tar

Dan heb je de uitvoerbare file bomb

Toen ik die uit probeerde te voeren kreeg ik
No such file or directory
terwijl het bestand toch echt bestaat.

Het blijkt dat het om een 32-bits bestand in een 64-bits Ubuntu gaat, en dan krijg je deze nietszeggende melding. Volgens deze pagina kan je het probleem oplossen door het ia32-libs-package te installeren.

Je kan trouwens met het file-commando zien of een uitvoerbaar bestand 32-bits is.


Online disassembler

    Tweeten

© Henk Dalmolen
Reageer via E-mail (dalmolen@xs4all.nl)

Deze pagina is voor het laatst gewijzigd op: 12-02-23 20:13:21