EIn bissel C++ und Assembler :-)



  • Hallo!

    Ich hab da mal eine Frage. Ich möchte nen Buffer überfluten 😃 und die Rücksprungadresse soll natürlich geändert werden.

    Zum Beipiel auf 0x004010F0.

    buffer[3] = '\x00';
    buffer[2] = '\x40';
    buffer[1] = '\x10';
    buffer[0] = '\xF0';

    Soweit kein Probelm.

    Aber bei einer Adresse wie 0x004000F0 gibts Probleme, denn ich möchte den Puffer mit der String-Kopier-Funktion strcpy() überfluten und ihr wisst ja, wie das ist mit \0.

    Kann ich da irgendwas machen?

    Ich wünschte, ich könnte einfach so nen Stuss verwirklichen:

    buffer[3] = '\x00';
    buffer[2] = '\x40';
    buffer[1] = '\\x00';
    buffer[0] = '\xF0';

    Aber dann ist die Rücksprungadresse total verfälscht.

    Hat jemand eine Lösung parat?

    Ich nutze das Wissen nicht für böse Absichten, sondern zu Ausbildungszwecken!

    Für Hilfe wäre ich sehr dankbar und würde euch weiter empfehlen 🕶



  • Google einfach nach "windows shell code".



  • Nullbytes im Shellcode lassen sich ja noch umgehen, aber bei Nullbytes in der Rücksprungadresse dürfte das schwierig sein, da die Rücksprungadresse ja zum Einsatz kommt, bevor dein Code ausgeführt wird (nämlich direkt beim Überlauf). Ich würde also versuchen, es so zu biegen, dass die Adresse keine Nullbytes mehr enthalten muss. Gegebenenfalls machst du deinen NOP-Bereich (falls vorhanden) um ca. 256 Bytes größer, damit auch ein 0x004001F0 trifft. Wenn der Buffer das nicht erlaubt, würde ich vielleicht versuchen den Shellcode woanders unterzubringen, wo du mehr Freiheit für deine Adressen hast.



  • Wenn Du von aussen einen String zufuehrst, und den Code kennst, der das Buffer-Overrun Problem hat, musst Du halt erst PC-relativen Code schreiben, der keine absoluten Adressen braucht, und von dort aus z.B. das EXE Patchen usw.



  • Das hab ich gesehen! Da will schon wieder jemand nen Virus schreiben! 😡



  • Bill Gates schrieb:

    Das hab ich gesehen! Da will schon wieder jemand nen Virus schreiben! 😡

    ne, voll nich 😉 Ich nutze das wirklich nur für die Ausbildung.

    Danke für eure Hilfe! Ich empfehle euch definitiv weiter! 🙂



  • Da sieht man auch, dass ich keinen Viraus schreiben will/kann:

    #include "stdafx.h"
    #include "string.h"

    void function(char* parameter);
    void function2();

    void function(char* parameter) {

    char buffer[1];

    strcpy(buffer, parameter);

    printf("Der Char: %s", buffer);
    }

    void function2() // Adresse: 0x00408010
    {

    printf("\ngeil toll super");
    getchar();

    }

    void main(int argc, char* argv[]) {

    if (argc > 1)
    {
    if (strcmp(argv[1], "overflow") == 0)
    {
    function("\x90\x90\x90\x90\x90\x90\x90\x90\x80\x10\x40");
    }
    else
    {
    function(argv[1]);
    }
    }
    else
    {
    }
    }

    Das kleine Programm hat eine "function2", die nicht aufgerufen wird. Sie wird nur indirekt aufgerufen, wenn ich einen Buffer Overflow in der "function1" hervorrufe und die Adresse von function2 an die richtige Stelle platziere.

    Ich habe das Problem, dass wenn ich den String, der überfluten soll und die Adresse übergibt, über ArgV nicht richtig einlesen kann.
    Hier ist die Return-Adresse 00401080 (also 801040). Wenn ich den String intern übergebe (also man "overflow" als Parameter übergibt), funzt es prächtig.

    Aber wenn ich den String über ArgV einlese, habe ich Probleme.
    Übergebe ich als Parameter (ArgV) \x90\x90x...\x80\x10\x40, dann ist klar, dass er edes Zeichen einzeln (als 4 Byte) interpretiert.
    Also übergebe ich`s über ASCII Zeichen.

    ÉÉÉÉÉÉÉÉÇ►@ <- wäre die richtige Lösung. ABER mit ArgV werden Zeichen, die nicht im ASCII drin stehen (É - 0x144, Ç - 0x128) falsch umgewandelt 😮

    (EDIT: Hier im Forum werden genau diese Zeichen richtig umgewandelt, aber die des ASCII-Zeichensatzes nicht..)

    Warum? 😕 Habt ihr Ideen, was man dagegen tun kann?

    Danke!



  • ich würd sagen, schau dir erstmal den asm code an, den dein programm erzeugt, dann weist genau was du schreiben musst...


Anmelden zum Antworten