Frage zum Reverse Engineering und Funktionen von Betriebssystemen



  • Hallo ist es eigentlich noch möglich nachvoll ziehen zu können was z.b. eine bestimmte Funktion genau bewirkt wenn man z.b. im Disassembler/Debugger nicht solch einen Hinweis stehen hat?

    0040116B |. 68 A4204000 PUSH Project1.004020A4 ; /format = "ok"
    00401170 |. E8 83010000 CALL <JMP.&CC3260MT._printf> ; \_printf

    <JMP.&CC3260MT._printf> <-- Daran kann man ja erkennen das es sich um die printf Funktion handelt welche Aufgerufen wird.

    Was aber wenn dort z.b. nur <JMP.&CC3260MT> stehen würde ?

    Wenn man sich die printf Funktion dann genauer im Dissassembler anschaut sieht man ja das die printf Funktion selbst noch sämtliche andere Funktionen aufruft.

    Wäre das ganze für eine einzelne Person noch nachvollziebar ?

    Und woher kommt z.b. die printf Funktion ?

    Als z.b. Windows entwickelt wurde hatte Microsoft doch bestimmt nur die Funktionen zu verfügung die die Hardware oder das BIOS bereitstellt.

    Falls das so ist wurde dann z.b. printf oder auch alle anderen Funktionen aus den Funktionen zusammengebaut die die Hardware bereitstellt oder das BIOS ?

    Wobei es bei Linux ja auch printf gibt musste das dann anderes Programmiert werden als das printf für Windows ?

    #include <stdio>
    
    int main( )
    {
    
    printf("ok");
    
    system("PAUSE");
    }
    

    main

    00401168 main                  /.  55                PUSH EBP
    00401169                       |.  8BEC              MOV EBP,ESP
    0040116B                       |.  68 A4204000       PUSH Project1.004020A4                 ; /format = "ok"
    00401170                       |.  E8 83010000       CALL <JMP.&CC3260MT._printf>           ; \_printf
    00401175                       |.  59                POP ECX                                ;  CC3260MT.3267E552
    00401176                       |.  68 A7204000       PUSH Project1.004020A7                 ; /command = "PAUSE"
    0040117B                       |.  E8 7E010000       CALL <JMP.&CC3260MT._system>           ; \_system
    00401180                       |.  59                POP ECX                                ;  CC3260MT.3267E552
    00401181                       |.  5D                POP EBP                                ;  CC3260MT.3267E552
    00401182                       \.  C3                RETN
    

    printf Funktion

    326639D0 _printf                 55                  PUSH EBP
    326639D1                         8BEC                MOV EBP,ESP
    326639D3                         53                  PUSH EBX
    326639D4                         68 48706A32         PUSH CC3260MT.326A7048
    326639D9                         8D5D 0C             LEA EBX,DWORD PTR SS:[EBP+C]
    326639DC                         E8 9F290000         CALL CC3260MT.32666380
    326639E1                         59                  POP ECX                                ; CC3260MT.3267E552
    326639E2                         53                  PUSH EBX
    326639E3                         6A 00               PUSH 0
    326639E5                         6A 00               PUSH 0
    326639E7                         8B45 08             MOV EAX,DWORD PTR SS:[EBP+8]           ; Project1.00402034
    326639EA                         50                  PUSH EAX
    326639EB                         68 48706A32         PUSH CC3260MT.326A7048
    326639F0                         68 841E6632         PUSH CC3260MT.32661E84
    326639F5                         E8 7E320000         CALL CC3260MT.32666C78
    326639FA                         83C4 18             ADD ESP,18
    326639FD                         8BD8                MOV EBX,EAX
    326639FF                         68 48706A32         PUSH CC3260MT.326A7048
    32663A04                         E8 3F2A0000         CALL CC3260MT.32666448
    32663A09                         59                  POP ECX                                ; CC3260MT.3267E552
    32663A0A                         8BC3                MOV EAX,EBX
    32663A0C                         5B                  POP EBX                                ; CC3260MT.3267E552
    32663A0D                         5D                  POP EBP                                ; CC3260MT.3267E552
    32663A0E                         C3                  RETN
    


  • Ich versuche jetzt mal die GetDC Funktion genauer nachzuvollziehen.
    Die enthält nämlich nicht noch tausende von CALL´s

    Aber jetzt bin ich bei dem Befehl SYSENTER angekommen

    Auf wikipedia konnte ich mich zu dem SYSENTER etwas einlesen: http://de.wikipedia.org/wiki/Systemaufruf

    Wenn ich diesen Befehl ausführe dann müsste ja meine Funktions Parameter und die Funktions Nummer an eine weitere Funktion übergeben werden welche sich im Kernel befindet.

    Ist es möglich sich auch diese Funktion anzuschauen ?

    #include <windows>
    
    int main( )
    {
    HWND h ;
    
    GetDC ( h );
    
    system("PAUSE");
    }
    

    [asm]
    7C91E510 KiFastSystemCall 8BD4 MOV EDX,ESP
    7C91E512 0F34 SYSENTER

    [/cpp]



  • Weiss das den keiner ? 😞



  • Wo möchtest du denn genau hin mit deiner Frage?

    Es ist in diesem Zusammenhang hilfreich, wenn du

    1. printf und andere Funktionen selber in klassischen Asm und auf WindowsApi programmieren kannst.
    2. ein kleines Betriebssystem oder Teile davon selbst programmiert hast
    3. gewisses tiefschürfendes KnowHow zu deinem Betriebsystem hast (z.B. windows, linux, opensolaris - wobei bei letzteren ja vieles open source ist, aber eben nicht alles und bei ersterem ist es gut, sich mit undokumentierten Funkionen auszukennen.
    4. gutes Verständis vom "protected mode" hast.
    5. Grenzen vom debuggern und disassemblern kennst
    6. Exploids entwickeln und reversen kannst.

    Das ist letztlich eine Menge Holz, als einzelner und ohne Hintergrundwissen eben mal ein Windowsprogramm in den Debugger/Disassembler schmeissen, und auf verstehen hoffen, kannst du vergessen. Und es macht auch mit den oben genannten Voraussetztungen noch eine Menge Arbeit beispielsweise einen Exploit zu entwickeln.

    Ein klassicher Assembler printf ist übrigens ganz einfach, wenn man die vielen anderen interessanten funtkionen, die das "echte" printf kann (z.B. rechnen) mal aussen vor lässt.



  • Dafür kann ich ein Exploit schreiben das meinen Shellcode ausführt. ^^
    Aber darum ging es ja nicht.

    int main( int argc , char *argv[] )
    {
    char buf[500];
    
    strcpy ( buf , argv[1} );
    
    return 0;
    }
    

    Danke für die Antwort.

    Da hab ich ja noch einiges vor mir. :p


Anmelden zum Antworten