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´sAber 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