Eigenes OS programmieren

Moin moin,

ich möchte mir ein eigenes OS programmieren! Bevor Bevor nun gleich irgendein Gemecker kommt will ich erstmal behaupten das es nicht viel können soll, fürs erste ein Kernel mit einer einfachen Textausgabefunktion. Ich habe Vorkenntnisse in C und C++ (ein paar Jahre), welche wahrscheinlich nicht schlecht sein werden. Nun will ich als Bootloader GRUB benutzen, zumindest fürs erste und der Kernel soll in Assembler geschrieben werden. Hab im Internet jede Menge darüber gefunden Kernel in C und so weiter aber ich denke in Assembler macht das ganze am meisten Sinn. Dazu muss ich wohl leider sagen das ich so gut wie gar keine Erfahrung mit Assembler habe und die meisten Tutorials die man dazu findet behandel gleich irgendwelche Windows Programmierungssachen welche mich ja nun nicht interessieren. Daher wäre meine ersten Frage ob mir jemand ein paar Assembler Tutorials zeigen die mir weiterhelfen... Die zweite Frage gilt allen anderen Tutorials, möglicherweise sogar ( ich weiß das klingt bescheuert ) einer Schriott für Schritt Erklärung über einen so einfachen Kernel. Ich kann mir nicht vorstellen das da so sonderlich viel Code hinter steckt.

Vielleicht gibt es ja auch noch andere Leute, die sich damit gerne mal ausseinander setzen wollen und genauso wenig Ahnung wie ich haben dann könnte man sich vllt mal über ICQ, Facebook oder sonstwas unterhalten ;)

Ich bin dankbar für jede Antwort!

MfG Inv151673 ;)

Betriebssystem, programmieren, selber, Assembler, CPP, OS, Bootloader, kernel
Wie kriege ich mit ROP einen "/bin/sh" Pointer in rdi?

Ich versuche, rücksprungorientierte Programmierung (ROP) zu lernen.

Und zwar habe ich ein Programm mit einem Pufferüberlauf auf dem Stack, und ich möchte das Programm dazu bringen, /bin/sh zu öffnen.

Das geht mit dem execve Syscall, wenn ich die richtigen Instruktionen finden kann, um die Funktionsparameter vorzubereiten. Das ist die Signatur von execve:

int execve(const char *pathname, char *const _Nullable argv[], char *const _Nullable envp[]);

Also muss ich die folgenden Register setzen:

  • rax = 0x3b (Syscallnummer von execve)
  • rdi = "/bin/sh" Pointer
  • rsi = NULL
  • rdx = NULL

Die folgenden Instruktionen habe ich bereits gefunden:

pop rax ; ret
pop rdi ; ret
pop rsi ; ret
pop rdx ; ret
syscall

Ich kann also die Instruktionen und Registerwerte mit dem Pufferüberlauf auf den Stack schreiben und so meine Register füllen. Das Problem ist aber, dass ich einen "/bin/sh" Pointer in rdi brauche (also nicht "/bin/sh" im Register, sondern eine Speicheradresse, an der "/bin/sh" steht).

Ich kann natürlich "/bin/sh" in den Puffer auf dem Stack schreiben, aber leider ist die Speicheradresse jedes Mal anders und ich kenne sie vorher nicht.

Ich weiß, dass "/bin/sh" in libc vorkommt, aber auch dort ist die Speicheradresse jedes Mal anders und ich kenne sie vorher nicht.

Wie komme ich also an einen "/bin/sh" Pointer? Gibt es Tricks oder bestimmte Instruktionen, nach denen ich mich umsehen sollte?

hacken, Hack, Programm, programmieren, pointer, Assembler, Hacker, Hacking, Informatik, IT-Sicherheit, Shell, stack, x64, Exploit, hacken lernen, IT-Sicherheitsexperte, Register, Capture The Flag

Meistgelesene Beiträge zum Thema Assembler