Drahtlose Netzwerke sind überall: Zu Hause, im Café und in der Firma. Im Gegensatz zu Kabelnetzen verliert der Admin bei WLANs allerdings schnell die ... (mehr)

MIPS-Architektur im Überblick

MIPS ist eine RISC-Architektur (Reduced Instruction Set Computer) und unterscheidet sich insofern von der bekannten x86-Familie, die auf einem Complex Instruction Set Computer (CISC) aufbaut. Wie der Name bereits andeutet, verstehen RISC-CPUs weniger Instruktionen als CISC-CPUs. Die Einfachheit des reduzierten Befehlssatzes ermöglicht eine schnellere Ausführung und damit höhere Performance. Diese an sich erwünschte Einfachheit impliziert außerdem Vorsichtsmaßnahmen, derer sich die Entwickler von Schadcode bewusst sein müssen.

So ist der MIPS-Befehlssatz nicht nur kleiner, die Befehle haben auch eine feste Länge. Unabhängig von der Aufgabe sind alle Instruktionen 16 oder 32 Bit lang. Diese Längenbeschränkung erschwert zunächst das Entwickeln von Exploits, weil keine Teilstücke von Kommandos als ROP-Gadgets verwendet werden können. In einer CISC-Architektur ohne feste Byte-Grenzen kann dagegen eine Instruktion eine Untermenge einer längeren Instruktion sein. Auch der Suffix einer und der Präfix einer anderen Instruktion lassen sich unter CISC-Bedingungen zu einem neuen Befehl kombinieren.

Ein weiterer Unterschied ergibt sich beim Ausführen einer Sprunganweisung im Code. Dabei wird nämlich die auf die Verzweigung folgende Instruktion mit ausgeführt. Diese Beschränkung muss man beim Entwickeln von Exploits ebenfalls im Auge haben, weil die zusätzliche Instruktion einen nachteiligen Einfluss auf die Register der CPU haben kann. Wenn beispielsweise in dem folgenden kurzen Beispiel die »jalr« -Instruktion abgearbeitet wird, dann wird außerdem (»ori a1,s0,0x2« ) ausgeführt. Dieser so genannte Branch Delay Slot ändert den Inhalt des A1-Registers, indem die Anweisung dort das Ergebnis der bitweisen OR-Verknüpfung ablegt.

# move    t9,s1
# jalr    t9
# ori     a1,s0,0x2

Schließlich ist ein letzter Unterschied zur CISC-Architektur, dass Rücksprungadressen in CPU-Registern und nicht auf dem Call Stack gespeichert werden. Diese Eigenschaft erschwert ebenfalls das Entwickeln von Exploits, weil jetzt nicht nur der Stack manipuliert werden muss, sondern zusätzlich das RA-Register der CPU mit der Return Address.

Return Oriented Programming (ROP)

Heutzutage ist ROP eine eingeführte Technik, um Bugs auszunutzen, die den Speicher korrumpieren – beispielsweise Buffer-Overflows – und um die Data Execution Prevention (DEP) zu umgehen. Herkömmlicherweise überschreibt der Angreifer bei einem Buffer-Overflow eine legitime Rücksprungadresse auf dem Stack mit einer neuen Adresse, die dann auf böswilligen Shellcode verweist.

Konzeptionell arbeitet ROP in der gleichen Weise, der Unterschied ist nur, dass die Rücksprungadresse nun mit einem Zeiger auf das erste ROP-Gadget einer Kette überschrieben wird. Diese Technik erlaubt es dem Angreifer, CPU-Register und verschiedene Speicherzellen im Memory zu ändern, noch bevor Shellcode ausgeführt wird, der ebenfalls im Speicher abgelegt wurde.

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2021