x86 assembly programming
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.
Links
Reageer via E-mail (dalmolen@xs4all.nl)
Deze pagina is voor het laatst gewijzigd op: 12-02-23 20:13:21