MS-DOS Virus World

Bild

Dieser Beitrag ist eine Textversion meines Vortrags auf dem 35. Chaos Computer Congress Ende 2018.

Und so muss ich zugeben, dass MS-DOS ein wenig empört ist, obwohl mich MS-DOS-Malware immer in gewissem Maße fasziniert hat, aber zuerst müssen wir fragen: "Was ist DOS?"

  • DOS ist eine Version von CP / M, einem anderen sehr alten Betriebssystem.
  • Die DOS-Familie umfasst eine Vielzahl von Anbietern. Nur weil es sich um DOS handelt, bedeutet dies nicht, dass es auf einer 8086-CPU oder besser ausgeführt wird
  • Einige dieser DOS-Anbieter sind API-kompatibel, was bedeutet, dass einige von ihnen Malware verwenden!


Bild

Leistungsvideo:


EDISON Software - Webentwicklung
Der Beitrag wurde mit Unterstützung von EDISON Software verfasst, die eine Anwendung für einen virtuellen Mobilfunkbetreiber entwickelt und sich mit der Entwicklung und Wartung von Websites in Python befasst .

Bild

Tatsächlich sind die meisten unserer Erinnerungen an die DOS-Ära die Ästhetik, wie Computer dieser Zeit aussahen:

Bild

Dies ist die Ära des „Beige Computing“ und der Model M-Tastatur, die berühmt oder berüchtigt sein kann, je nachdem, ob Sie die laute Tastatur mögen oder nicht.

Bild

Einige von uns haben möglicherweise Erinnerungen an die Verwendung von DOS, andere verwenden möglicherweise noch DOS!

Bild

Zum Beispiel soll George R. Martin, der The Game of Thrones geschrieben hat, Wordstar in DOS verwendet haben, um ein Buch zu schreiben!

Bild

Wir können auch QBASIC nicht verpassen, für viele wäre dies ihre erste Kenntnis der Programmierung!

Bild

Aber manchmal war das Leben mit DOS nicht so gut, manchmal haben Sie DOS verwendet, und solche Dinge passierten plötzlich. In diesem Beispiel wird während des Druckvorgangs eine kleine Melodie abgespielt. Dies kann in einer Büroumgebung eine sehr unangenehme Situation sein.

Bild

Einige von ihnen sind „süßer“, in diesem Fall fährt beispielsweise ein mit ASCII-Symbolen gezeichneter Krankenwagen vorbei, und dann startet das Programm, das Sie öffnen möchten, im schlimmsten Fall mit geringfügigen Unannehmlichkeiten.

Dank einer Reihe von Malware-Archivaren, die unter dem Namen VX Heavens laufen, haben wir ein gutes historisches DOS-Malware-Archiv, oder zumindest bis die ukrainische Polizei die Website überfällt:
Am Freitag, dem 23. März, wurde der Server von der Polizei im Zusammenhang mit einer strafrechtlichen Untersuchung (Artikel 361-1 des Strafgesetzbuchs der Ukraine - Erstellung von Schadprogrammen zum Zweck des Verkaufs oder der Verbreitung von Schadprogrammen) auf Aufforderung einer Person beschlagnahmt. über "Platzieren von schädlicher Software mit freiem Zugriff für unbefugtes Hacken von Computern, automatisierten Systemen und Computernetzwerken".

Glücklicherweise verfügen beliebte Torrent-Sites immer noch über Kopien der Site-Datenbank, die uns einen hervorragenden Datensatz liefern können:

$ tar -tvf viruses-20070914.tar | wc -l 66714 $ ls -alh viruses-20070914.tar 6.6G viruses-20070914.tar 

Um diese Stichproben zu untersuchen, müssen wir jedoch zunächst den typischen Verteilungsfluss dieser Stichproben verstehen, da diese Programme in der Zeit vor dem Internet funktionierten:

Bild

Nachdem Sie die infizierte Datei auf Ihrem System erhalten und ausgeführt haben, sucht oder installiert das Schadprogramm aktiv nach Systemaufruf-Interceptors für die von Ihnen ausgeführten Programme. Er tut dies oft auf subtile und unsichtbare Weise, um einer Entdeckung zu entgehen. Die Wichtigkeit der Subtilität ist wichtig, da Sie dieses Schadprogramm entweder mit einem Medium (Diskette) auf ein anderes System übertragen oder auf einen anderen Verteilungspunkt wie BBS herunterladen müssen, um dieses Schadprogramm zu verbreiten.

Bild

Zur Laufzeit hat die Malware zwei Optionen. Es kann entweder verborgen bleiben und neue Dateien infizieren oder eine Nutzlast anzeigen.

Einige Nutzlasten sind ziemlich hübsch! Im folgenden Beispiel werden ungewöhnliche Funktionen verwendet, z. B. 256 Farben:

Bild

Oder dieses, das mit Ihrem Bildschirmpuffer spielt:

Bild

Bild

Zum größten Teil bleibt die Malware jedoch stumm und versucht, Dateien für eine Infektion zu finden. Die Infektion der meisten Dateien ist sehr einfach, wenn Sie beispielsweise die COM-Datei als langes Band mit Maschinencode anzeigen:

Bild

Dann müssen Sie nur noch JMP am Anfang des Programms einfügen und am Ende des Programms Daten hinzufügen. Es wird ungefähr so ​​aussehen:

Bild

Einige Codes waren intelligenter und fanden „leeren Speicherplatz“ in der Binärdatei und schrieben sich dort selbst, wodurch verhindert wurde, dass die Binärdatei größer wurde, was möglicherweise bedeutete, dass das Antivirenprogramm die rote Fahne verwenden konnte.

Bild

Zuvor erwähnte ich jedoch auch das Abfangen von Systemaufrufen. Trotz der Tatsache, dass die MS-DOS-Laufzeit sehr einfach und praktisch ungeschützt ist (Sie können Linux trivial aus einer COM-Datei laden). Es enthält weiterhin die vollständige API, sodass Anwendungen keine eigene Dateisystemimplementierung benötigen. Hier sind einige Syscalls-Funktionen:

Bild

Sie verursachen einen Software-Interrupt, bei dem das Programm den Prozessor auffordert, in einen anderen Abschnitt des Systemspeichers zu wechseln, um etwas zu verarbeiten:

Bild

MS-DOS bietet jedoch auch die Möglichkeit, diese Aufrufe hinzuzufügen / zu ändern (mithilfe eines anderen Aufrufs), sodass Sie das System erweitern können, damit neue Treiber zur Laufzeit geladen werden können. Es ist jedoch auch ein idealer Ort, um Malware-Abschnitte hinzuzufügen:

Bild

Es war ein weit verbreiteter Trick, da Sie den Aufruf "Datei öffnen" abfangen und ihn dann verwenden konnten, um neue ausführbare Dateien im System zu erkennen ... und sie zu infizieren.

Schauen wir uns als kurzes Beispiel für ihre Verwendung ein einfaches Hello World-Programm an:

Bild

Wie wir sehen können, gibt es zwei Aufrufe vom Typ int . Wir verwenden 21h (h = hex) als Rufnummer des Hauptsystems und können basierend auf dem Wert von Ah angeben, welche Aktion MS-DOS ausführen soll

Bild

In diesem Fall ruft das Programm zum Drucken der Zeile auf und beendet das Programm mit dem Rückkehrcode 0 (undefiniert).

Wie bereits erwähnt. Wenn Sie int 21h aufrufen, sucht der Zentralprozessor in der IVT-Tabelle, wohin er gehen soll. In diesem Handler befindet sich häufig ein Segment wie ein Router, der verschiedene Hauptaufrufe weiterleitet. Im Fall von Int 21h leitet er verschiedene Funktionen basierend auf dem Wert ah an. Sobald wir an dem Ort angekommen sind, wird der eigentliche Anrufbearbeiter die Aufgabe erledigen, dann wird er iret ausführen, um zum Hauptprogramm zurückzukehren, und häufig Register der Ergebnisse des Anrufs hinterlassen:

Bild

Also Wenn wir alle Systemaufrufe sehen möchten, die das Programm gestartet hat, können wir am Anfang des Interrupt-Handlers einen Haltepunkt setzen und überprüfen, was ah ist:

Bild

Wir tun dies, weil sich der Interrupt-Handler in MS-DOS immer an einem festen Ort befindet (dies ist viel früher als in der ASLR- und Kernel-ASLR-Ära) und der Programmspeicherort nicht.

Bild

Sobald wir es starten, können wir die Herausforderungen sehen, die dieses Muster mit sich bringt. Während wir auf dem Bildschirm sehen können, dass er gerade eine Benachrichtigung über die Ziegen-Datei gedruckt hat (Ziege ist eine Datei, die wie eine Opferziege infiziert werden soll). Wir sehen auch, dass dieses Programm mehr als nur eine Zeile druckt. Es überprüft die DOS-Version (wahrscheinlich um die Kompatibilität zu überprüfen) und öffnet, liest und schreibt Daten!

Bild

Das ist interessant! Wir möchten jedoch mehr über die rot hervorgehobenen Systemaufrufe erfahren, da diese Eingaben enthalten müssen, damit Dateinamen und Daten in Dateien geschrieben / auf den Bildschirm ausgegeben werden können.

Dazu müssen wir uns während des Systemaufrufs andere Register ansehen:

Bild

Am Beispiel von „Print String“ können wir sehen, wie die Verwendung aussieht:

Bild

Was ist DS: DX? Warum gibt es hier zwei Register und wie erhalten wir Daten von ihnen?

Dazu müssen wir etwas mehr über den 8086-Prozessor verstehen.

Bild

Der 8086-Prozessor ist eine 16-Bit-CPU, jedoch mit 20-Bit-Speicheradressierung. Dies bedeutet, dass der Prozessor nur Werte speichern kann, die 64 KB anzeigen. Dies ist ein Problem, wenn die Speicherkapazität bis zu 1 MB beträgt.

Um dies zu umgehen, müssen wir die Segmentierungsregister verstehen:

Bild

Der 8086-Prozessor verfügt über 4 Segmentierungsregister, um die wir uns kümmern müssen:

  • CS - Codesegment
  • DS - Datensegment
  • SS - Stapelsegment
  • ES - ein zusätzliches Segment (falls Sie noch eines benötigen, um verschiedene Situationen zu umgehen)

Es gibt eine Reihe anderer Universalregister, die Sie vor übermäßiger Speichernutzung bewahren und es Ihnen ermöglichen, Parameter an andere Funktionen zu übergeben.
Die Segmentierung registriert die Arbeit durch Ändern des Blocks im RAM:

Bild

Dadurch kann die 16-Bit-CPU alle 20 RAM-Bits sehen und sicherstellen, dass der Block für jeden DS-Wert um 16 Byte versetzt ist.

Bild

In diesem Fall wird der DS-Aufruf als Zeiger innerhalb des 16-Bit-Fensters verwendet, um festzustellen, wo sich der Zeilenanfang befindet. Dann scannt der Zeilendrucker, bis er das Zeichen $ findet, und stoppt dann. Dies ähnelt anderen Systemen, die Null-Bytes anstelle von $ verwenden.

Bild

Mit dem Alter von ISA x86 hat sich wenig geändert. Statt der Tatsache, dass die Prozessorbitgröße zugenommen hat, sind dieselben Register breiter geworden.

Mit diesem Wissen können wir eine Liste von „Aufgaben“ erstellen, um diese Programme zu verfolgen:

Bild

Mit dieser Einstellung können wir mehrere große Computer für mehrere Stunden auf das Problem werfen und die Ergebnisse sammeln!

Bild

Und wir bekommen ...

Bild

Nichts dergleichen.

Das ist enttäuschend.

Wir haben mindestens einen Hamster mit Kraft verbrannt und fast keine coolen Aktivierungen bekommen! (Xs wie man das übersetzt)

Bild

Wenn wir uns einige Beispiele ansehen, sehen wir hier eine rauchende Waffe. Ein anständiges Stück prüft Datum und Uhrzeit.

Wenn wir uns die Dokumentation für diese Aufrufe ansehen, werden wir sehen, dass der Systemaufruf Werte in Form von Registern für das Programm zurückgibt:

Bild

Also können wir sie brutal zwingen! Alles was wir tun müssen ist so etwas:

Bild

Bei dieser Methode gibt es jedoch ein Problem.

Bild

Der Testschritt des Beispiels dauert ungefähr 15 Sekunden, da der vollständige QEMU-Emulationsprozess verwendet wird, und es kann bis zu 15 Sekunden dauern, bis das Programm vollständig in der virtuellen Maschine ausgeführt wird. Da DOS keine Energiesparfunktionen hat, bedeutet dies, dass sich DOS im Standby-Modus in einem Besetztzyklus befindet

Wir könnten dieses Problem also anders betrachten, indem wir uns ansehen, welcher Code nach der Datums- / Zeitanforderung ausgeführt wird.

Da sich unser Tracer im Interrupt-Handler befindet, wissen wir aus der Box nicht, wo sich das Programm befindet:

Bild

Dazu müssen wir uns den Stapel ansehen, in dem die CS- und IP-Register auf uns warten!

Bild

Sobald wir diese beiden Register vom Stapel genommen haben, können wir sie verwenden, um den Rückkehrcode abzurufen, sodass unsere Checkliste folgendermaßen aussieht:

Bild

Nachdem wir dies getan und den Datensatz wiederholt getestet haben, werden wir sehen, wie ein Teil des Rückkehrcodes aussieht!

Bild

Hier ist ein Beispiel von einem. Hier sehen wir, dass ein Vergleich für DL und 0x1e durchgeführt wird.

Bild

Wenn wir uns unsere Dokumentation ansehen, werden wir sehen, dass DL der Tag des Monats ist, dh wir können die drei wichtigsten Operationscodes wie folgt analysieren:

Bild

Wir könnten das alles manuell durchsehen, aber es gibt viele dieser Beispiele, die die Zeit überprüfen, etwa 4700:

Bild

Also müssen wir stattdessen etwas anderes tun. Wir müssen etwas schreiben ... Wir müssen schreiben ...

Bild

Der schlechteste x86-Emulator der Welt, BenX86, ist ein Emulator, der speziell für unsere Anforderungen entwickelt wurde, und nicht mehr:

Bild

Aber er hat einige Vorteile in seiner Geschwindigkeit.

Bild

Bild

Wir haben 10.000 verschiedene Ausführungstests hinzugefügt, basierend auf den Pfaden, die wir mit Brute Force mit BenX86 gefunden haben. Also werde ich mit einigen meiner Lieblingsentdeckungen enden, die zeitaktiviert sind:

Bild

Dieses Muster wird am Neujahrstag aktiviert und legt Ihr System auf, nachdem eine Begrüßung angezeigt wurde. Es kann gut sein, wenn Sie für das neue Jahr im Büro festsitzen, oder es kann schlecht sein, wenn Sie am Neujahrstag wirklich etwas tun müssen.

Bild

Dieses Beispiel hat mich sehr überrascht. Es wird Anfang 1995 aktiviert und informiert den Benutzer über alle infizierten Dateien, die es infiziert hat, entfernt dann den Virus (löscht den Übergang zu Beginn) und unternimmt dann nichts anderes. Obwohl aus irgendeinem Grund angegeben wird, dass Sie McAfee kaufen sollten, ist diese Nachricht offensichtlich nicht veraltet.

Bild

Das verwirrt mich ehrlich gesagt wirklich, am 8. November eines jeden Jahres werden alle Nullen im System in winzige Glyphen des „Hasses“ verwandelt. Es stört mich wirklich, wenn Sie wissen, warum Sie es brauchen, lassen Sie es mich wissen ...

Bild

Dies ist wahrscheinlich mein Albtraum, wenn nach dem Starten eines Programms die Meldung angezeigt wird, dass sie Ihr Hauptlaufwerk nicht essen konnte. Es wäre unglaublich beunruhigend, aus heiterem Himmel zu sehen.

Bild

Zusammenfassend haben wir die Navy Seal Copypasta-Version von DOS-Malware. Ich bin mir nicht sicher, ob dieser Autor Aladdin nicht mag, aber was auch immer Sie tun, Sie sind eine Person.

Wenn Sie an dem Code interessiert sind, der in diesem Artikel ausgeführt wurde, habe ich mein Toolkit auf github ohne Garantie veröffentlicht. Wenn Sie diesen Code selbst erstellen möchten, müssen Sie sicherstellen, dass er mit Ihrer MS-DOS-Installation funktioniert (Behebung eines Handler-Haltepunkts).

Wenn Sie jedoch nur sehen möchten, was ich beim Betrachten dieses Projekts gesehen habe, habe ich die Weboberfläche hier archiviert: dosv.benjojo.co.uk

Bis bald!

Source: https://habr.com/ru/post/de440086/


All Articles