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 aus 😃

    Wä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 dank 🙂

    das ist es tatsächlich gewesen. Jetzt funktioniert alles wie es soll 🙂
    Diese Verwechslung hab ich nicht zum ersten Mal gemacht 😃

    @YASC && @Ringding

    vielen Dank für Eure Hilfe 🙂
    Auf dem Board sind doch die kompetentesten Leute 🙂

    Gruss 🙂


Anmelden zum Antworten