Wo steckt der Wurm drin?
-
hi Leute
ich hab ein ganz kurzes Programm, welches vielleicht unsinnig
codiert ist (es geht einfacher). Dies hat jedoch nur einen Übungszweck.Das Prog fragt nach einer eingabe (OK)
Das Prog verlangt eine eingabe (speicherzgriffsfehler)
Dann soll es die Eingabe wider ausgeben ... (nicht geprüft)Hier der code (nasm/linux):
global _start section .data msg1 db 0x0A,"Bitte geben Sie einen Text ein!",0x0A,"> ",0x0 ; 36 section .text _start: push dword msg1 push dword 36 call ausgabe pop eax pop eax sub esp,256 push dword esp push dword 256 call eingabe pop eax ; enthaelt die 100 pop ebx ; enthaelt die addrese vom Buffer auf dem stack push dword ebx push dword eax call ausgabe pop eax pop eax add esp,256 ; vernichte den Buffer ende: mov eax,1 xor ebx,ebx int 0x80 ausgabe: push ebp mov ebp,esp mov eax,4 ; ssize_t write(int fd, const char *buf, size_t count); mov ebx,1 mov ecx,[ebp+12] mov edx,[ebp+8] int 0x80 pop ebp ret eingabe: push ebp mov ebp,esp mov eax,3 ; ssize_t read(int fd, void *buf, size_t count); mov ebx,0 mov ecx,[ebx+12] mov edx,[ebx+8] int 0x80 pop ebp ret
Hab schon herausgefunden, dass der Fehler (Speicherzugriffsfehler) immer
in der function "eingabe" kommt. Wie man sieht will ich einen Buffer auf
den stack anlegen, bevor ich ihn übergebe.Wo steckt der Wurm drinn?
Für eure Antwort wäre ich sehr dankbar
Gruss
-
Hi.
Beim Programmieren von Würmern/Trojanern/Viren usw. wird dir hier mit Sicherheit nicht geholfen.
-
gain schrieb:
Hi.
Beim Programmieren von Würmern/Trojanern/Viren usw. wird dir hier mit Sicherheit nicht geholfen.
LOL das ist doch nur eine Redewendung
(bedeutet so viel wie: "Wo ist der Fehler?")
sieht das da oben etwa wie ein wurm ausWäre nett wen Du Dir vorerst meine Frage durchlesen würdest bevor Du mir was vorwirfst. Jedoch ich sehe das wie Du
Gruss
-
Schaut eigentlich ganz gut aus. Ich hab jetzt nicht gecheckt, ob wirklich die richtigen Register mit den richtigen Werten geladen werden. Ich hoffe, das hast du schon überprüft.
Das push esp würd ich nicht machen. Ich kann mich dunkel erinnern, dass verschiedene Prozessoren hier verschiedene Ergebnisse liefern - das war zwar irgendwo in den 286er-Zeiten, aber trotzdem. Sicher ist sicher. Aber selbst wenn es nicht das tut, was du erwartest, sollte es erst bei der Ausgabe crashen (weil dann der gepushte Stackpointer überschrieben ist).
-
Hi vielen Dank für Deine Antwrt
Ringding schrieb:
Ich hab jetzt nicht gecheckt, ob wirklich die richtigen Register mit den richtigen Werten geladen werden. Ich hoffe, das hast du schon überprüft.
Yo, habe ich gemacht
Ringding schrieb:
Das push esp würd ich nicht machen. Ich kann mich dunkel erinnern, dass verschiedene Prozessoren hier verschiedene Ergebnisse liefern - das war zwar irgendwo in den 286er-Zeiten, aber trotzdem. Sicher ist sicher.
Nun das habe ich bissher immer gemacht, und hatte dammit eigentlich nie Probleme.
Hab in der Literatur zu neuen cpus nachgeschaut, die scheinen es auch zu verwenden.Ringding schrieb:
Aber selbst wenn es nicht das tut, was du erwartest, sollte es erst bei der Ausgabe crashen (weil dann der gepushte Stackpointer überschrieben ist).
Weis leider nicht genau was Du meinst
Habs nun genauer Untersucht: Das ganze crasht dort (in "eingabe") vor dem "int 0x80"also bei den Zeilen:
mov ecx,[ebx+12] mov edx,[ebx+8]
Doch was die Ursache dessen ist weis ich leider nicht
Soweit: Danke
-
Ich schätz mal, dass du statt ebx ebp meinst. ebx belegst du doch erst mit 0. Klar, dass dann ein Zugriffsfehler kommt.
-
@YASC
Vielen dankdas ist es tatsächlich gewesen. Jetzt funktioniert alles wie es soll
Diese Verwechslung hab ich nicht zum ersten Mal gemachtvielen Dank für Eure Hilfe
Auf dem Board sind doch die kompetentesten LeuteGruss