Hexdump geedited - SIGSEGV



  • Hab ein einfaches C++ Prog geschrieben:

    #include <iostream>
    using namespace std;
    
    int main()
    {
            cout << "Peter\n";
            return 0;
    }
    

    Hab das file dann mit khexedit geoeffnet.
    Die relevante Stelle sieht wie folgt aus:

    [b]0000:0900[/b] 01 00 02 00 50 65 74 65 72 0a 00 00 01 1b 03 3b ....Peter......;
    [b]0000:0910[/b] 3c 10 00 00 05 00 00 00 08 fd ff ff 5c 10 00 00 <........ýÿÿ\...
    [b]0000:0920[/b] 0c fe ff ff 78 10 00 00 44 fe ff ff 94 10 00 00 .þÿÿx...Dþÿÿ....
    

    Nun habe ich an das "Peter" ein "Maffay" angehaengt und extra darauf geachtet, dass am Ende des Strings wieder ein 0x0 auftaucht:

    [b]0000:0900[/b] 01 00 02 00 50 65 74 65 72 4d 61 66 66 61 79 0a ....PeterMaffay.
    [b]0000:0910[/b] 00 00 01 1b 03 3b 3c 10 00 00 05 00 00 00 08 fd .....;<........ý
    [b]0000:0920[/b] ff ff 5c 10 00 00 0c fe ff ff 78 10 00 00 44 fe ÿÿ\....þÿÿx...Dþ
    

    Tja, beim executen gibts trotzdem nen Segmentation Fault.
    Woran liegt das?


  • Mod

    😃 😃 😃 😃 😃

    sorry, musste mal sein 🤡



  • 😞
    Was ist denn?
    Ist das so laecherlich?



  • In anbetracht der Tatsache, dass du offensichtlich keine Ahnung hast, was du da getan hast: Irgendwie schon. 😉 😃 :p

    Aber mal so als Denkanstoss: Was meinst du, hast du da im Programm ueberschrieben? 😉


  • Mod

    ... und extra darauf geachtet, dass am Ende des Strings wieder ein 0x0 auftaucht

    diese bemerkung reizt einfach zum lachen.

    1. es ist nat. richtig, dass strings null-terminiert sein müssen, allerdings dürfte es kaum zum seg-fault kommen, falls du die 0 mal vergisst, irgendwo wird schon ein 0 byte auftauchen, der string ist dann halt nicht ganz der, den du willst.

    2. das eigentliche problem ist, dass du daten einfügst - das ist noch schlimmer als sie zu überschreiben. wenn du überschreibst sind nur die daten zerstört, die du direkt berührst. wenn du einfügst, befindet sich ab dieser stelle nichts, aber auch gar nichts mehr dort wo es hingehört. der computer ist grundsätzlich dumm - er wird daten immer an ein und derselben stelle (relativ zum dateianfang) erwarten. damit dein vorgehen funktioniert, müsstest du eine ganze menge dinge (z.T. auch code) direkt ändern. mittels hexeditor kannst du sinnvoll strings höchtens kürzen ohne schaden anzurichten.



  • der computer ist grundsätzlich dumm - er wird daten immer an ein und derselben stelle (relativ zum dateianfang) erwarten

    😮

    Hat jemand mal einen Link o.ae. , wo man etwas ueber dieses Thema nachlesen kann?


  • Mod

    naja, du könntest dich mit z.b. mit dem windows PE format auseinandersetzen
    http://msdn.microsoft.com/msdnmag/issues/02/02/PE/default.aspx
    aber im grunde ist die problemamtik völlig unabhängig vom konkreten executable format - selbst mit .com dateien hat man dieses problem:
    es ist nunmal so, das in executables die daten durch ihre position identifiziert werden, es gibt keine (oder nur sehr rudimentär um sektionen zu trennen) metadaten-zwischenschicht; den computer würden diese metadaten sowieso nicht interessieren und executables sollen und werden normalerweise nicht durch den menschen angesehen. im übrigen würde eine solche indirektion die ladezeiten sehr ungünstig beeinflussen.



  • ach so.
    ich dachte, eine executable wuerde sequentiell vom dateianfang durchgegangen und wuerde bit fuer bit ausgefuehrt...


Anmelden zum Antworten