Insights Blog Bare Metal Reversing Foundations: ...

Bare Metal Reversing Foundations: Physischer Speicher

Verfasst von Viacheslav Moskvin
Agenda

bare metal 1

Dieser Beitrag wurde aus dem Englischen übersetzt. Zum Originalbeitrag.

Wenn Sie mit Bare-Metal-Firmware arbeiten, haben Sie Zugriff auf jedes einzelne Bit Code – vom Beginn bis zum Ende der Ausführung. Das bedeutet unter anderem, dass nichts vorausgesetzt werden kann: Sämtliche CPU-Subsysteme sind zunächst uninitialisiert, einschließlich der Memory Management Unit (MMU). Mehr noch – abhängig vom Zielsystem kann es sein, dass die MMU während der gesamten Laufzeit überhaupt nicht initialisiert wird.

Doch welche Aufgabe hat die MMU? Sie ist die Hardwarebasis für das Konzept des virtuellen Speichers.
Virtuelle Speicheradressen sind vielen bereits bekannt. Sie stellen für jeden Prozess einen eigenen, isolierten Adressraum bereit, der üblicherweise vom Betriebssystem und der MMU verwaltet wird. Die MMU ist dafür verantwortlich, diese virtuellen Adressen in physische Adressen zu übersetzen.

Unterschied zwischen virtuellem und physischem Speicher

Jedes einzelne Datenbit, das vom Betriebssystem oder einer User-Space-Anwendung verarbeitet wird, befindet sich irgendwo im physischen Speicher (sofern es nicht ausgelagert wurde). Das Betriebssystem und die MMU übernehmen die Übersetzung virtueller in physische Adressen über mehrere Ebenen von Seitentabellen. Kennt man sowohl die virtuelle Adresse als auch das Format dieser Tabellen, ist es möglich, die entsprechende physische Adresse zu berechnen.

Dasselbe gilt umgekehrt für physische Adressen: Mit Kenntnis einer Adresse und des vom Speichercontroller verwendeten Algorithmus lässt sich der exakte physische Ort eines Datenbytes auf einem DRAM-Chip bestimmen.

Ein DRAM-Chip ist in mehrere Bänke unterteilt, diese wiederum in Zeilen und Spalten. Ein DIMM-Modul verfügt über zwei Seiten (Ranks), die jeweils Speicherchips enthalten können. Außerdem gehört jedes Modul zu einem Speicherkanal.

Mark Seaborn hat durch Experimente mit einem Rowhammer-Proof-of-Concept den zugrunde liegenden Algorithmus zur Umrechnung physischer Adressen untersucht:


Bare Metal2

Das ist zweifellos interessantes Wissen – aber hat es praktische Relevanz? Tatsächlich ist die genaue physische Position von Speicherzellen beispielsweise für den oben genannten Rowhammer-Angriff erforderlich. Sie kann auch für Techniken wie EMI-Glitching von Bedeutung sein, wobei hier häufig der klassische Trial-and-Error-Ansatz praktikabler ist. In 99,9 % der realen Anwendungen bleibt dieses Wissen jedoch eher theoretischer Natur – im Gegensatz zum nächsten Thema.


Memory Mapped IODas ändert sich jedoch, wenn man auf ungewöhnlichen Code stößt:

Da die MMU zu Beginn der Ausführung einer Bare-Metal-Firmware inaktiv ist, arbeiten Programme direkt im physischen Adressraum. In den meisten Fällen hat das keine besonderen Auswirkungen – Speicherzugriffe funktionieren wie gewohnt. Das ändert sich jedoch, wenn man auf ungewöhnlichen Code stößt:

Bare metal13

Hier zeigt ein hervorgehobener Zeiger auf eine Adresse, die nicht zur Firmware selbst gehört. Was verbirgt sich dahinter? Es handelt sich um Memory-Mapped Input/Output (MMIO) – ein Verfahren, mit dem CPUs, SoCs oder Mikrocontroller Peripheriegeräte für Entwickler zugänglich machen. Da dabei dieselben Instruktionen wie bei normalen Speicherzugriffen verwendet werden, ermöglicht MMIO eine besonders effiziente Kommunikation mit Hardware-Komponenten.

Bei Standard-Hardware lassen sich diese Speicherzuordnungen in den jeweiligen Datenblättern nachschlagen. Im gezeigten Beispiel wird ein STM32-Mikrocontroller verwendet, dessen Dokumentation frei verfügbar ist.

Dort wird ersichtlich, dass die betreffende Adresse zum USART2-Modul gehört (vergleichbar mit einer UART-Schnittstelle). Die Umrechnung des zweiten Funktionsparameters von Hexadezimal (0x1C200) in Dezimal ergibt 115200 – eine gängige Baudrate für serielle Kommunikation. Die Funktion dient also dazu, die Geschwindigkeit von USART2 zu konfigurieren.

Bare metal4

Die Funktion selbst wandelt die Baudrate in die vom USART-Controller benötigten Einheiten um und schreibt das Ergebnis an einen Offset von 8 Byte relativ zur Basisadresse von USART. Damit ist die Baudrate gesetzt. Weitere Parameter wie Datenbits werden auf ähnliche Weise konfiguriert. Auch die eigentlichen Datenbytes werden über andere Offsets zur USART-Basisadresse übertragen.

baremetal5


Weitere Informationen zu unserem Ansatz für robuste digitale Sicherheit finden Sie in unseren Cybersecurity-Services.