Format Strings Exploitation geht bei mir nicht

  • C

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von just_one_help4me.

    Format Strings Exploitation geht bei mir nicht

    Heyo guten Tag/Nach,

    ich hab mich letztens auf galileocomputing wieder mal rumgetrieben und hab deren Katalog durchgelesen und bin bei "C von A bis Z" gestoßen.
    Ich hab halt dann angefangen mir des openbook durch zu lesen und bin in Kapitel 4.1.2 auf die Format String Exploitation gestoßen und neugierig wie ich bin hab ich auch danach gesucht und bin auf folgendes PDF Dokument gestoßen: exploit-db.com.
    Ich hab das auch gleich auspobiert (ich verende Code::Blocks). Als ich das Programm mit der CMD aufgerufen habe mit dem Parameter $(python -c'print"%08x"*20') hat mir die Console angezeigt: "You wrote $(python". Ich war schon fast am Verzweifeln...dann ist mir eingefallen dass die Windows CMD ja teilweise auf Leerzeichen in Strings reagiert und dann aus einem String, zwei macht.
    Desshalb hab ich das Argument in Anführungsstriche gesetzt: "$(python -c'print"%08x"*20')" und es hat mir dann statt dem %08x irgend eine achtstellige Hex-Adresse angezeigt: "You wrote:
    $(python -c'print"0542a51ex"*20'), laut der PDF sollte es mir aber "You wrote: %08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x" anzeigen...
    Was mach ich falsch?
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    just_one_help4me schrieb:

    Was mach ich falsch?
    Du hast vergessen, Deinen Code zu posten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dachte, das wäre klar, schließlichhab ich geschrieben dass ich das was auf der exploit-db.com Dokument steht, gleich ausprobiert habe, aber sry wenns nicht klar war
    Also hier der Code:

    C-Quellcode

    1. int main(int argc, char *argv[]) {
    2. char test[1024];
    3. strcpy(test, argv[1]);
    4. printf("You wrote: ");
    5. printf(test);
    6. printf("\n");
    7. }
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    just_one_help4me schrieb:

    Dachte, das wäre klar
    Hier ist gar nix klar. :D
    Das ist ja sehr interessant.
    Ich habe eine Unicode-Console, und wenn ich Deinen Text $(python -c'print"%08x"*20') als Argument übergebe, kommt kein Argument an :!: :?: :!:
    Ohne das führende $ funktioniert es, wie es soll.
    Spoiler anzeigen

    C-Quellcode

    1. int _tmain(int argc, _TCHAR* argv[])
    2. {
    3. if (argc == 1)
    4. {
    5. return 0;
    6. }
    7. wchar_t test[1024];
    8. wcscpy(test, argv[1]);
    9. wprintf(L"You wrote: ");
    10. wprintf(test);
    11. wprintf(L"\n");
    12. getchar();
    13. return 0;
    14. }
    Iwie liegt es am $-Zeichen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also ich hab mir deine Code kopiert und ihn eingefügt, selbes Ergebnis. Aber das ganze "$python(...)" hat nichts bewirkt wie gesagt nichts, es steht dann in der Ausgabe "You wrote [...]" und dann halt das "$python(...)" aber anstatt des %08x steht dann bei mir 00000000x
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Was mach ich falsch?
    Du benutzt Windows?! Für $(...) benötigst du eine brauchbare Shell, z.B. bash unter Linux. Bin mir nicht sicher, ob Windows-CMD etwas äquivalentes zu bieten hat.
    Alternativ kannst du natürlich auch einfach %08x 20mal hintereinander schreiben.

    Btw, ohne das Paper gelesen zu haben, aber wer tatsächlich strcpy(test, argv[1]); oder printf(test); so, wie in deinem Bsp. verwendet, sollte besser keine (C-)Programme schreiben...
    An den Funktionen ist erstmal nichts falsch. (Wie geschrieben, habe das Paper nicht gelesen.)

    Wer strcpy ohne Längenprüfung verwendet, hat einen wunderbaren Bufferoverflow in seinem Programm. Und eine Variable als erstes Argument bei printf zu übergeben, ist (in 99.9% aller Fälle) einfach nur dämlich.
    Häufig klappt alles, aber wenn man mehr als 1023 Zeichen eingibt oder ein paar Formatspezifizierer, wird du festestellen, dass ich wesentlich mehr mit deinem Programm machen kann, als nur die Eingabe auszugeben...
    Was mach ich falsch?

    Der Autor der verlinkten PDF-Datei verwendet offensichtlich nicht die Windows-Eingabeaufforderung, sondern eine UNIX-Shell in Verbindung mit Python.
    Um den Befehl unter Windows auszuführen, würde ich eine MSYS-Shell verwenden. Damit Python gefunden werden kann muss es evtl. erst zur PATH-Variable hinzugefügt werden:

    Quellcode

    1. PATH=$PATH.:/pfad/der/python/installation
    2. export PATH

    Dann kannst du dein Programm über die MSYS so starten wie der Autor der PDF-Datei.

    Nur zum Verständnis: Es wird nicht der String "$(python -c 'print "%08x."*20')" an das Programm übergeben. Dieser Ausdruck wird erst "ausgewertet" sprich Python mit den Argumenten -c 'print "%08x."*20' gestartet und die Rückgabe von Python übergeben.
    Was also letztlich übergeben wird, kannst du dir so ausgeben lassen:

    Quellcode

    1. echo $(python -c 'print "%08x."*20')

    Ich hab es bei mir schnell getestet, übergeben wird letztlich folgende Zeichenkette: "%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Infinity“ ()

    Danke Infinity für deine ausführliche Antwort
    Hab mich schon gefrag, warum da $(python(...) steht...aber da ich das jetzt weis...

    @3dcliff: also wie gesagt, ich hab ja auch ned mit absicht die unsicheren Funktionen verwendet, darüber wurde ich schon mehrfach aufgeklärt, dass man lieber anders hernehmen sollte, aber es ging mir bei diesem Programm ja auch ned primär um die Funktionen, sondern um das Ergebnis.
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell