PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : frage zu assembler



GU4RDI4N
13-05-2005, 19:27
hi,
ich hab mich vor ein paar tagen entschlossen,
assembler zu lernen.(unter Suse 9.1)
ich hab auch schon ein kleines bischen erfahrung durch ein sehr kurzes tutorial, wo die grundlegenden sachen erklärt werden.
also nasm und ld instaliert, und mich an das erste programm gemacht das im tut erklärt wird, Hello World.
nur, mehr als Hello World gibts in dem Tut nicht.
nun wollte ich fragen, obs ne liste mit allen Systemaufrufen(0-190) + erklärung des aufrufs gibt?
wenn nicht, kann ich ohne risiko einfach ausprobieren welcher aufruf was macht?

GU4RDI4N
13-05-2005, 19:53
hat sich erledigt,
ich hab ne liste gefunden.
http://www.lxhp.in-berlin.de/lhpsysc1.html
http://www.lxhp.in-berlin.de/lhpsysc2.html
http://www.lxhp.in-berlin.de/lhpsysc3.html
http://www.lxhp.in-berlin.de/lhpsysc4.html
http://www.lxhp.in-berlin.de/lhpsysc5.html

GU4RDI4N
14-05-2005, 17:45
hab jetz doch noch ne frage:

bitte nich mekkern, wegen anfänger fehlern,
hab gestern abend erst mit assembler angefangen.
und dies ist (neben "hello world") mein erstes programm,
eine passwortabfrage.(nur zu lern/test-zwecken)

ich hab folgenden code: (pw.asm)


section .text
global _start
frg db 'Bitte passwort eingeben:',0x0A
lfrg equ $ - frg
rgt db 'richtiges passwort eingegeben',0x0A
lrgt equ $ - rgt
PW db '12345'
lPW equ $ - PW
wrg db 'passwort falsch',0x0A
lwrg equ $ - wrg
inp db 'NONE'
_start:
mov eax,4 ;nach passwort fragen
mov ebx,1
mov ecx,frg
mov edx,lfrg
int 0x80

mov eax,3 ;eingabe einlesen
mov ebx,1
mov ecx,inp
mov edx,10
int 0x80
linp equ $ - inp

mov AX,PW
cmp AX,inp ;eingabe mit passwort vergleichen
je richtig
jmp falsch


ende:
mov eax,1
int 0x80

richtig:
mov eax,4 ;erfolg ausgeben
mov ebx,1
mov ecx,rgt
mov edx,lrgt
int 0x80
jmp ende

falsch:
mov eax,4 ;fehlschlag ausgeben
mov ebx,1
mov ecx,wrg
mov edx,lwrg
int 0x80
jmp ende


und beim linken kommt folgende meldung:


dhcppc3:~ # cd '/root/coding/ASM/projekte/passwort abfrage'
dhcppc3:~/coding/ASM/projekte/passwort abfrage # nasm -f elf pw.asm
dhcppc3:~/coding/ASM/projekte/passwort abfrage # ld -s -o pw pw.o
pw.o(.text+0x7e): In function `_start':
: relocation truncated to fit: R_386_16 .text
pw.o(.text+0x82): In function `_start':
: relocation truncated to fit: R_386_16 .text
dhcppc3:~/coding/ASM/projekte/passwort abfrage #



was mach ich falsch?

GU4RDI4N
15-05-2005, 12:59
weiss keiner ne antwort?

hab inzwischen bemerkt das die zwei fehler immer auftauchen wenn ich auf AX zugreifen will.


...
mov AX,PW
cmp AX,inp ;eingabe mit passwort vergleichen
...


wenn ich die zeilen rausnehme, kommen zwar keine fehler mehr,
aber das prog macht nicht das was es soll.

Joghurt
15-05-2005, 13:52
Wie wäre es mit mov eax,pw? pw ist schließlich eine 32bit-Adresse.

Edit, ich sehe gerade, du machst das ganz falsch, du musst Zeichen für Zeichen vergleichen. So in der Art

mov esi,(offset von pw)
mov edi,(offset von eingabe)
mov ecx,(länge von pw)
rep cmpsb
jnz kennwort_falsch
(was passiert bei richtigem kw)
kennwort_falsch:
(was passiert bei falschem kw)

locus vivendi
15-05-2005, 14:00
Übrigens wäre es vielleicht eine Überlegung wert, die AT&T Assembler-Syntax zu verwenden. Die ist auf Unixen eigentlich üblicher. Nasm kannst du ja trotzdem behalten, wegen der umfangreichen Befehls-Referenz.

GU4RDI4N
15-05-2005, 14:53
danke @joghurt

den befehl rep kannte ich vorher noch nicht,
das kommt davon wenn man kein "ordentliches" tutorial zur hand hat.
(weil ich das mit dem rep noch nicht zu 100% verstanden hab werd ich mich nochmal bei google melden, stichwort "assembler rep")

aber das einlesen der eingabe funktioniert noch nicht so ganz.


...
mov eax,3 ;eingabe einlesen
mov ebx,1 ;wo es herkommt, hier von der konsole
mov ecx,inp ;wo es hinsoll, nach inp
mov edx,10 ;wieviele zeichen es sein dürfen
int 0x80
linp equ $ - inp ; und die länge von inp in linp schreiben
...


wies eigentlich funktionieren sollte hab ich von
http://www.lxhp.in-berlin.de/lhpsysc1.html (nummer 3)

bitte melden wenn ich was falsch verstanden hab.

Joghurt
15-05-2005, 19:53
Das linp ist falsch, es würde auf die Anzahl bytes zwischen inp und der Codestelle int 0x80 gesetzt.

GU4RDI4N
15-05-2005, 21:22
in dem tutorial steht geschrieben, das es so funktioniert.


...
msg db 'Hello world',0x0A ; unser Text incl. Zeilenumbruch LF (0x0A)
len equ $ - msg ; Länge des Textes berechnen (12 Bytes)
...


oder wie geht die berechnung der länge?

Joghurt
16-05-2005, 11:38
In diesem Falle geht es ja auch, da es ein fester Wert ist. $ steht immer für die aktuelle Speicherstelle, und wenn du von ihr die Speicherstelle, die auf den Beginn des Strings zeigst, abziehst, hast du die Länge.
Die Linux funktion 3 gibt die eingabe in ecx zurück, die musst du dann irgendwo abspeichern.

Such nochmal weiter nach Tutorials, dir fehlen im Moment noch einige wichtige Grundlagen.

GU4RDI4N
19-05-2005, 13:38
ich habe es mal probiert die ausgabe durchzuführen,
ohne in EDX was reinzuschreiben.
also ohne eine längenangabe.
die ausgabe funktioniet prima, aber es wird "none"(die vorbelegung) ausgegeben,und nich "1234", was ich eingegeben habe.
also hab ich nochmal alles durchgeschaut,
und bemerkt das ecx nicht in inp geschrieben wird, weil ich den befehl in ein kommentar verwandelt hab, da dies einen fehler gab.
dann hab ich in verschiedenen tuts nach einer erklärung gesucht, aber keine gefunden.

der code:


section .text
global _start
frg db 'Bitte passwort eingeben:'
lfrg equ $ - frg
rgt db 0x0A,'richtiges passwort eingegeben',0x0A
lrgt equ $ - rgt
PW db '1234'
lPW equ $ - PW
wrg db 'passwort falsch',0x0A
lwrg equ $ - wrg
inp db 'none',0x0A
_start:
mov eax,4 ;nach passwort fragen
mov ebx,1
mov ecx,frg
mov edx,lfrg
int 0x80

mov eax,3 ;eingabe einlesen
mov ebx,0
mov edx,10
int 0x80
;mov inp,ecx <- verursacht einen fehler, KA wieso,hab
;auch in Tuts keine erklärung gefunden
;linp equ $ - inp

;jmp vergleich

mov eax,4 ;eingabe ausgeben
mov ebx,1
mov ecx,inp
;mov edx,linp
int 0x80
jmp ende

vergleich:
mov esi,PW ;(offset von pw)
mov edi,inp ;(offset von eingabe)
mov ecx,lPW ;(länge von pw)
rep cmpsb
jnz falsch
jmp richtig

ende:
mov eax,1
int 0x80

richtig:
mov eax,4 ;erfolg ausgeben
mov ebx,1
mov ecx,rgt
;mov edx,lrgt
int 0x80
jmp ende

falsch:
mov eax,4 ;fehlschlag ausgeben
mov ebx,1
mov ecx,wrg
;mov edx,lwrg
int 0x80
jmp ende


könnt ihr mir helfen?
ich finde einfach keine deutschen assembler-tutorials, die mit nasm arbeiten und das ELF format nutzen.

Joghurt
19-05-2005, 14:03
Du musst ecx mit der Adresse von inp laden, bevor du den Read aufrufst. Woher soll der Kernel sonst wissen, wohin er die Daten schreiben soll?

Und gewöhne dir so schnell wie möglich ab, als root zu arbeiten! Umsomehr, wenn du Programmierst, und noch mehr, wenn du in Assembler programmierst! Du kannst mit einem Zahlendreher dein System unbrauchbar machen.

Joghurt
19-05-2005, 14:33
So, als Einstieg mal das Programm, so wie es funktioniert.
Die Daten musst du im .data Segment ablegen, da .text nicht beschriebbar ist und du einen SEGFAULT bekommst, sobald du versuchst, linp etc zu beschreiben. Die Fehlermeldung hatte damit aber nichts zu tun, du musst mov [linp],ecx schreiben.


section .data
frg db 'Bitte passwort eingeben:'
lfrg equ $ - frg
rgt db 'richtiges passwort eingegeben',0x0A
lrgt equ $ - rgt
PW db '1234'
lPW equ $ - PW
wrg db 'passwort falsch',0x0A
lwrg equ $ - wrg
inp db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;; inp db 25 dup (0) kann NASM nicht! WTF?
linp dd 0
section .text
global _start
_start:
mov eax,4 ;nach passwort fragen
mov ebx,1
mov ecx,frg
mov edx,lfrg
int 0x80

mov eax,3 ;eingabe einlesen
mov ebx,0
mov ecx,inp
mov edx,25
int 0x80
mov [linp],eax

mov eax,4 ;eingabe ausgeben
mov ebx,1
mov ecx,inp
mov edx,10
int 0x80
; jmp ende

vergleich:
mov eax,[linp]
mov ecx,lPW
sub eax,ecx ; eax sollte jetzt 1 sein, da das eingegeben Kennwort noch ein Return drin hat und die Länge damit eins größer ist.
dec eax ; d.h. eax muss jetzt 0 sein
jnz falsch ; wenn nicht, können die PW nicht gleich sein.

mov esi,PW ;(offset von pw)
mov edi,inp ;(offset von eingabe)
;; ecx ist noch gesetzt von oben
rep cmpsb
jnz falsch
jmp richtig

ende:
mov eax,1
xor ebx,ebx ;exitcode 0 => kein Fehler, kann man natürlich entsprechend der KW-Eingabe setzen
int 0x80

richtig:
mov eax,4 ;erfolg ausgeben
mov ebx,1
mov ecx,rgt
mov edx,lrgt
int 0x80
jmp ende

falsch:
mov eax,4 ;fehlschlag ausgeben
mov ebx,1
mov ecx,wrg
mov edx,lwrg
int 0x80
jmp endeHTH

GU4RDI4N
19-05-2005, 16:00
Vielen dank,
das mit dem .data segment hätten die in dem tut ruhig erwähnen können.

ich werd jetzt mal mit dem wissen ein bisschen rumexperimentieren und dann seh ich mal weiter.

auf deinen rat hin hab ich mir jetzt nen neuen user angelegt,
zum proggen.

cu

Joghurt
19-05-2005, 17:10
auf deinen rat hin hab ich mir jetzt nen neuen user angelegt,
zum proggen.Besser als nichts, aber den User solltest du für alles nehmen. Root ist nur für kurzfristige Sachen wie Editieren von Config-Dateien oder installation neuer Software gedacht, und mit sudo ist das kein Problem, mal schnell nach root zu wechseln.

Vergiß nie: root umgeht ALLE Sicherheitsvorkehrungen, du hast in etwa ein Windows 95 System. Also nochmal: gewöhne es dir ab, als root zu arbeiten, du sparst dir sehr viel ärger, ein einfaches rm -r .* bedeutet als root z.B. den fast kompletten Datenverlust!

Lin728
20-05-2005, 19:47
ein "rm -rf *" bedeutet vollständigen DATENVERLUST (es sei denn man mag dann die Daten aus dem Stream rauskratzen ;-)

Jetzt hab ich ne externe Backupplatte ;-)

Joghurt
20-05-2005, 23:32
Ich sprach ja auch von
rm -r .*(man achte auf den Punkt)
Grundgedanke: alle Benutereinstellungen löschen (die ja in .rc files und .verzeichnissen gespeichert werden), und da man als root arbeitet, wird das natürlich unter /root getan. Nur passt nunmal auch .. auf .* und damit hat man auch effektiv ein rm -r / gemacht.

Dieses sind die kleinen Unix-Fallstricke, mit denen man sich schnell erhängen kann, wenn man als root arbeitet.

GU4RDI4N
28-05-2005, 18:52
nun noch eine kurze frage: was heisst "keystroke"?

bin auf meiner "forschungsreise" im internet auf das wort gestossen.

Joghurt
28-05-2005, 19:04
http://dict.leo.org/?search=keystroke

GU4RDI4N
28-05-2005, 19:09
thx joghurt