 In diesem Vortrag geht es um Deep Dive in the World of DOS Viruses, also ein tiefes Eintauchen in die Welt von Amas DOS Viren. Es geht um Amas DOS Version von vor 27 Jahren und da sehe ich quasi eine junge Version von mir selber, die über das selbe redet. Ich habe damals über ein Universitätsprojekt geredet, das ich etwa drei Jahre lang betreut habe und wir haben sehr angeschränkte Möglichkeiten. Inzwischen, 27 Jahre später, hat unser Sprecher verschiedene Dinge über Wi-Fi übertragen oder in Dubstep und alles, was wir damals probiert haben, hat mit viel Aufwand, hat er jetzt mit irgendwie so 4 Stunden CPU Zeit geschafft. Begrüßt Ben, großen Applaus. Vielen Dank. Hallo, ich mein Ben Karakoks, wie ihr da auf das Leid seht. Ich muss zuerst etwas gestehen, damit ihr euch diesen Bewusstsein, also DOS ist älter als ich, das steht auf das Leid, aber egal. Was ist DOS? Wir fangen direkt damit an. DOS ist ein Upgrade von CP1 aus einem anderen alten Betriebssystem und DOS unterstützt sehr viele Herstellern. Einige DOS, das waren kompatibel, so einige teilen auch ihre Malwehre untereinander. Also die meisten Leute kennen Leute von diesen alten Boxen, das am besten mit dem Model M dasatur, das die meisten wegen seinem Sound hassen und so hat DOS damals ausgesehen. Eigentlich ziemlich unspektakulär. So, das war WordStar, ist WordStar. Einige, bis Nacht Game of Thrones wurde in WordStar geschrieben. Er war offensichtlich ein großer Freund von modernen Programmen wie WordStar. Es war auch aus sicherheitstechnischer Sicht sicher, weil man hatte immer noch kein Internetaccess. Und für viele Leute war das auch das erste Mal, als sie programmiert haben. Da wurde auch KeyBasic erfunden. Wissen Sie wahrscheinlich, da gab es eine sehr einfache Programmiersprache und viele haben das so als Anstiegstrohge ins Programmieren verwendet. Für andere Leute war die Erfahrung mit DOS nicht so großartig. Ich musste zum Beispiel einfach Arbeiter ledigen und dann ist auf einmal das passiert. Leider hat es jetzt kein Sound dazu, aber stellt euch einen PC-Lautsprecher vor, der so Techno auf einer Frequenz spielt. Das kann sehr peinlich sein in einem Büro. Das kann man nicht abbrechen. Man muss das spielen lassen. Wenn man eine Tasse drückt, sagt es, dass man nichts drücken soll. Ja, das ist sehr lustig oder reden wir auch nicht, aber es ist nicht wirklich bösartig. Das ist ein anderes gutes Beispiel von einem DOS-Virus, die Ambulanz. Dann fährt die Ambulanz vorbei und dann geht das Programm normal weiter. Ich mag das, ich finde das großartig. Diese Webseite hat das gut zusammengefasst, die Geschichte da rüber und die ukrainische Polizei hat zum Beispiel Folgendes zusammengefasst. Sie sagen, jemand hat wohl gesagt, dass jemand mal verteilt, die funktioniert inzwischen nicht mehr. Die Polizei hat eine Hausdrucksuchung gemacht. Aus dieser Hausdrucksuchung gibt es nun einen Snapshot mit vielen alten Viren aus der Ammas-Doszeit. Das Interessante daran, da gibt es 66.000 und es ist 6,6 Gigabyte groß. Diese Viren, sie machen eigentlich nicht viel, sie sind nur ein paar Beiz. Die sind relativ einfach, so zum Beispiel eine Ambulanz zu zeichnen und typischerweise hat auch die Weiterverbreitung sich geändert. Zum Beispiel, der Lebenszyklus eines solchen MS-DOS-Virus sieht wie folgt aus. Man downloadet so ein Programm. Es sieht so aus, als tut es nichts, aber es sieht jedenfalls für dich so aus. Dann lässt man noch mehr Programme laufen, der DOS-Virus infiziert noch mehr. Dann gibt man das eventuell weiter und zum Beispiel durch Raubkopien oder in irgendwelche Formen wird das weitergemacht und es verbreitet sich immer weiter. Dann geht die malware über die komplette Welt sehr schnell. Die meiste DOS-Malware ist relativ einfach. Es schaut, wenn wir fertig sind, wenn wir so weit sind, um Dinge anzuzeigen, dann tun wir das so was wie das hier. Es sieht schön aus, es nutzt VGA-Farben. Man kriegt so ein bisschen Demo-Scene, WIPEs davon. Manchmal kriegt man davon auch sehr komische Dinge, dass es weniger als ein Kilo weit, sogar viel weniger als ein Kilo weit. Man kriegt interessante Screen-Effekts. Zum Beispiel sieht man hier den Computer, das sich auflösen könnte relativ komisch sein, wenn man es nicht erwartet. Oder wenn man die Bedingungen nicht erfüllt hat, dann hockt man in SysCalls rein oder infiziert noch mehr Dateien. Wie man DOS-Programme infiziert, ist relativ einfach. Wir schauen uns den kompletten Code an. Man benutzt die ersten drei Befehle durch einen Jump zur Malware. Dort tut man dann die Malware hin. Sobald die Malware gelaufen ist, kann man wieder zurückspringen, wenn man möchte. Das ist auch noch so ein Ding bezüglich SysCalls. MS-DOS ist ein Betriebssystem, es hat SysCalls. Programme können MS-DOS-Fragen um Dinge zu tun, zum Beispiel Dateien zu Griff oder so. So, das machen wir mit einem Software Interrupt. Glücklicherweise kann man MS-DOS auch erweitern. Man kann nicht nur Händler erweitern, sondern sie auch ersetzen, was sehr interessant ist, wenn man Programme schreiben möchte, aber natürlich auch sehr interessant, wenn man Malware schreiben möchte. Manche interessanten SysCalls sind hier. Das sind die Sachen, die DOS breitstellt. Die sind einfach sehr nützlich im Allgemeinen. Hier sieht man ein sehr kurzes HelloWorld-Programm. Es ist fast das kleinste, was man machen kann, bis auf den HelloWorld-String. Das ist ein relativ einfacher Binary. Wir nehmen den Pointer zu dem Message, dann setzen wir den A8-Register zu 9 und dann der SysCalls, um einen String auszugeben. Dann nehmen wir den Software Interrupt Nr. 21 in Hexatelzimmer, dann setzen wir HH auf 4C in Hex und das beendet das Programm. Das ist das, was dann tatsächlich passiert. Man hat ein Programmcode, der den Interrupt auslöst. Dann kommen wir in den Interrupt-Händler. Dafür hat die CPU in den Interrupt-Vector-Table geschaut, in die erst 100 bytes davon. Das sieht so aus wie ein Router. Wenn ihr sowas schon mal geschrieben habt, das ist quasi das gleiche, bloß mit SysCalls. Das ist ein Compare, Compare, Compare, Compare und ein Jump, Jump je nachdem, was passiert. Dann sind wir im Call-Händler. Normalerweise kommen Dinge in Register oder auf den Stack und dann geht es wieder zurück zum Programm. Wenn wir uns das anschauen, was das Programm tatsächlich tut, dann müssen wir den Breakpoint hier hinsetzen, in den Interrupt-Händler. Das ist die einzige Position, wo wir sicher sind, dass es existiert. Das ist viel, viel entfernt davon, dass man Address Space Randomization hat und viel, viel länger noch, dass man im Betriebssystem das selber hat, im Kernel. Man kann aus diesem Grund sehr interessante Dinge z.B. z.B. auch Dienungsbutton direkt aus einem Commodateil. Wenn wir so einen File genau anschauen, können wir mal schauen, was da genau gemacht wird. In diesem Beispiel sieht man ein Goat-File. Das ist eigentlich nur dafür ge-design worden, um infiziert zu werden, also eine Ziege quasi. Und das kostet eine Opfer-Datei, um zu hoffen, dass es infiziert wird. Das macht reverse-Entschidieren natürlich einfacher. Wir sehen, was passiert da. Wir haben eine Datei-Wirke geöffnet. Das werden zwei Bytes davon gelesen und das wird hier geschlossen. Und das Ganze wird immer wieder wiederholt, zwischendurch wird der File-Point verschoben. Also, wenn verschiedene Teile der Datei gelesen, wir geben ein String aus. Und ja, das war es dann auch schon. Es gibt ein paar Systemaufrufe hier, die wir uns genau mal anschauen. Zum Beispiel das Open-File öffnen der Datei. Wir möchten auch wissen, was wird in die Datei geschrieben. Und wir wollen auch wissen, welche Dateinamen es aufruft. Es ist auch ein interessanter Test, um zu schauen, ob der Code funktioniert. Dazu müssen wir etwas tiefer in die MS-DOS Runtime schauen. Das Ganze ist im 16-Bit-Modus, Legacy-Modus. Das sind quasi alle Register, die ihr habt im 16-Bit-Modus. Wie schon gesagt, AHA, das Register AHA, ist das, was ihr nutzt, um den Systemaufruf zu spezifizieren. AHA ist die Hälfte von AHAX, das ist ein Acht-Bit-Register. Weil manchmal wollen die Leute einfach nur Acht-Bit. Warum auch immer? Ja, es spart Hauptsparkerplatz. Und das ist die Definition eines Systems-Aufrufs, um etwas auszugeben. Also man sagt, AHA gleich neun. Und den zweiten ist ein Pointer auf eine Stringzeit. Macht zuerst nicht so viel Sinn für mich, aber jetzt müssen wir uns schauen, wie Speicherverwaltung oder Speicher in diesen alten CPUs überhaupt aufgebaut ist. Es sieht im Grunde genommen so aus, man hat eine 16-Bit CPU, 24-Bit-Adress und etwa einen Megabyte-Ram. Also das ist das Maximum von Amistos in 16-Bit-Modus. Das Maximum, was das physikalisch sehen kann, ist 20-Bit. Die Frage ist jetzt, wie kann man denn alles, also 16-Bit wäre nur 64 Kilobytes und darum hat man einen Trick angewandt, damit man auch bis zu einem Megabyte adressieren kann. Es gibt verschiedene Segmente in Memory, die man bei der Adresse angeben muss. Und ja, kurzer Crash-Kurs mit Segmentregistern. Stell dir vor, ich habe einen großen Speicherbereich. Wir können aber nur 16 Wett auf einmal anschauen. Aber wir können dieses Fenster hin und her schieben im Speicher, um also quasi unsere Ansicht verändern. So können wir Daten im ganzen System hin und her schieben. Und diesen Final-Pointer können wir dann nutzen, um zu sagen, wie weit hinein in das Memory, in das Speicherssegment, man schauen soll. Es ist quasi ein Multiplikator. Also in einem Datensegment, zum Beispiel Datensegment 100, dann müssen wir 100 mal 16 rechnen und dann findet man so den Offset. Das geht dann so weiter. Also bei einer 16-Bit CPU, man hat schon eine Purposeregister. X46 hat relativ wenige General Purposeregister. Andere Architekturen haben mehr. Moderne GPUs haben hunderte oder tausende. Aber das hat eigentlich mit X86 nicht so geändert, wegen nur Quads Kompatibilität. Nur wurden die Register inzwischen breiter. Auch von 32-Bit auf 64-Bit wurden die Register noch einmal breiter. Also wir haben heutzutage viel Malware. Wir möchten wissen, was in diesem Archiv alles passiert. Und wir möchten das alles irgendwie automatisiert machen. Also was müssen wir uns machen? Wir machen uns eine Checkliste, wie man die Malware analysieren kann. Wir müssen also unsere Systemcalls anschauen. Welche Daten werden gelesen, geschrieben, den Systemcalls übergeben. Idealerweise wissen wir die 100 bytes von diesem Data Pointer. Aber es ist sehr praktisch das zu wissen. Zum Beispiel zu wissen, welche Dateien geöffnet werden. Wir sollten wahrscheinlich auf den Bildschirm aufnehmen. Und das können wir machen. Es braucht wahrscheinlich recht viel CPU-Zeit. Und weil wir können, wir finden nichts. Wir haben viel ausgeführt, aber das Meister hat einfach nichts gemacht. Warum ist das so? Wir sehen die ganzen Systemaufrufe. Und hier wird zum Beispiel das Datum aufgerufen. Und das erste Problem ist da, dass viele MS-DOS-Wirren wissen, dass sie keine Internetverbindung haben. Darum wird häufig auf das Datum zurückgegriffen. Die nutzen dann auch 8 Bit, um Platz zu sparen. Also ein Neiverweg führt den Virus aus. Wir versuchen verschiedene Daten, verschiedene Datumswerte. Und schauen, ob sich damit etwas ändert, wenn man ein anderes Datum weilt. Und dann haben wir einen neuen Testfall gefunden. Das Problem ist, das braucht alles 50 Sekunden CPU-Zeit. Weil das emulieren vom MS-DOS halt so viel braucht. Oder wir können uns das ein bisschen cleverer anschauen. Wenn wir darüber nachdenken, dann sind wir im Interrupt Handler. Wir sehen die inneren Teile des Interrupt Handlers. Der Interrupt Handler ist das einzige, wo wir wissen, dass es konsistent ist. Weil MS-DOS die Mailware irgendwo hinladen könnte. Aber wir wollen wissen, wo der Code tatsächlich ist, zu sehen, welcher Code als nächstes ausgeführt wird. Das heißt, wir schauen in den Stack-Segment. Hier haben wir wieder ein Stack-Segment und ein Stack-Pointer. Als erstes haben wir den Interrupt-Pointer. Dann sehen wir direkt, was nach dem Interrupt ausgeführt wird. Dann fügen wir einfach ein paar Dinge auf unser Checklist hinzu. Wir fügen einfach diese Stack-Adresse hinzu. Wir sehen, wir führen danach ein Compar aus mit DL auf 0x1e. Falls dieses der Vergleich als gleich aus gewertet wird, wird das dorthin gesprungen, ansonsten woanders hin. Wenn wir wieder zurück zum Cisco gehen, dann sehen wir, dass DL der Tag ist. Damit können wir uns anschauen, wenn 0x1e ist 30. Das heißt, am 30. gehen wir dorthin. Versus woanders gehen wir woanders hin. Wenn wir das immer wieder machen, dann sehen wir aus den 17.000 Dingens Runs machen. Dann sehen wir das 4700 davon Datum und Zeit checken. Das sind auch die schwierigsten, weil die verstecken irgendwas. Wir haben ein Code-Sempel, das wir uns anschauen, wenn wir returnen. Das Problem ist, wir können es nicht brute-forzen. Wir müssen irgendwas bauen, um das besser zu machen. Wir müssen den schlechtesten x86-Emulator der Welt bauen. Ich nenne ihn Ben x86. Jeder Spracherzugriff bricht die Emulation ab. Push macht nichts, Pop bricht wieder die Emulation ab. Die meisten Sachen, die implementiert sind, sind Jumps. Das kann dann ausgeführt werden mit einem Register Snapshot und einem Code-Sempel. Die meisten Malwares hatten nur drei verschiedene Code-Pfader. So haben wir 17.000 Beispiele, und etwa 10.000 davon nutzen, nehmen Datum, Zeit, Variation. Das sind ein paar davon, das zeige ich euch jetzt. Das ist ein Virus, der am 1.1980 nichts macht, aber am Neujahrstag, sagt er, das da. Jedes Programm macht das. Die Maschine hängt sich auf, und man kann nicht mehr arbeiten. Das kann schön sein, weil man am Neujahrstag nicht arbeiten muss, aber es kann natürlich auch mühsam sein. Ein anderes Beispiel, das sind normale Dateien, die auf einem Betriebssystem drauf wären, und daran ist das Virus angehängt. Was wir jetzt finden, ist das. Ich denke, das ist sehr interessant. Das sagt halt, man wurde im vorigen Jahr von einem Virus infiziert, quasi. Auch in einem Fall ist das ja hübsch. Der Autor des Virus sagt, hey, du wurdest im Fall infiziert, und ich entferne mich jetzt. Das scheint es auch, als wäre da vielleicht auch McAfee dahinter. Das war damals, als John McAfee auch tatsächlich geschrieben hat. Ja, sehr interessante Zeiten. Ein weiteres Beispiel. Diesen fand ich etwas obskur, das ist undurchsichtig. Am 8. November 1980, oder wahrscheinlich jedes Jahr, macht es aus jedem Null einen kleinen Glüfen, der Heid sagt. Wenn das jemand von euch versteht, dann helfen wir. Was heißt das? Ist das Kunst? Ich weiß es nicht. Ich wünschte, ich wüsste es. Es könnte ja eine CCC-Variante geben, die Mate schreibt. Ein weiteres gutes Beispiel. Das Letzte, was ich eigentlich von einem Programm nie sehen möchte, ist ein Fehler, der es laufend CCC zu essen. Ja. Könntest du bitte Eindrungen ändern, damit ich dein Teilsystem essen kann? Ja, und jetzt mein Favorit. Es bricht halt ab, das hier. Das ist das Copy-Pasta-Seal-Virus-Version. Ich bin ein Mörder. Ich hasse auch Aladdin, ich werde ihn killen, ich werde dich umbringen und so weiter. Der Virus ist sehr gefährlich, mächtiger als Gott. Das war das letzte Beispiel. Vielen Dank für eure Zeit. Ihr seht sich offen für Fragen und Vorschläge, falls ihr dieses Thema besser kennt als ich. Das hat mich total nostalgisch gemacht. Hier haben wir Mikrofone im ganzen Raum, 1,2,3,4. Vielleicht auch Fragen aus dem Internet. Kommt einfach zu den Mikrofonen, als Erinnerung. Ein Frage ist 1 bis 2 Sätze mit einem Fragezeichen und keine Lebensgeschichte. Schauen wir uns mal an. Mikrofon Nummer 1. Hallo Ben, danke für den Vortrag. Hast du eine Analyse darüber gemacht, welche mehr künstlerisch war und welche mehr Schaden machen? Die meisten machen Schaden. Es gibt solche, die z.B. alle Dateien löschen. Es gibt auch solche, die sich als Virus-Cunning-Tool verstecken oder ausgeben. Das ist dann sehr böse. Aber ich habe keine gefunden, die sehr brutal böseartig waren. Das ist natürlich heute anders, wo Spitalere gehen mit Krypto-Lockern. Ich habe noch eine Frage von 3. Viele industrielle Kontrollsysteme benutzen DOS. Was ist die Gefahr von DOS-Mailware damals? Es ist unwahrscheinlich, dass ein solches System heutzutage noch mit DOS-Mailware in Kontakt kommen wird. Damals war das Haupteinfalls-Tor, wenn man in wiege gekrackte Programme heruntergeladen hat. Aber es wäre natürlich interessant, wenn man heutzutage noch etwas finden würde, dass aber noch nicht so 20 Jahre alt ist, sondern sich. Habst du irgendwelche Bedingungen gefunden, die nicht Datums versät waren? Einige versuchen, die Datumserkennung zu umgehen. Es reski mir zu schnell, Entschuldigung. Es gibt auch hier die im Hintergrund laufen und den System-Timer abfragen. Manchmal kann aber das System-Timer auch nicht existieren. Das ist nicht das Bild von Virus. Ich habe auch ein Sample, ein Beispiel gesehen, der zum Beispiel nach 100 Tastendrücken etwas gemacht hat. Das ist dann schwierig zum automatisch Testen. Das kann man halt schwierig in 17.000 Beispielen machen. Noch eine Frage aus dem Internet. Habt ihr die Quakecode oder hast du die Quakecode von DOS-Mailware publiziert? Man findet immer noch Dumps davon, von einem VX-Heaven an vielen Torrent-Websites. Aber es gibt bestimmt auch Kopien davon, auch von anderen Webseiten. Mikrofon Nummer 1. Hallo, ich bin Joe. Danke für den Talk. Ich habe mich gefragt. Hast du irgendwas über Verwundbarkeiten oder Viren gelernt, was heute noch beigebracht werden sollte? Irgendetwas, was heute unterrichtet werden soll? X86 war ein Fehler. Das habe ich herausgefunden. Ich sehe keine Fragen mehr. Ach doch, eine Frage aus dem Internet. Hast du Mailware-Samples gefunden, die Dummy-Bineries vermieden haben? Das ist eine sehr gute Frage. Es ist etwas kompliziert. Einige Viren, ich versuche mal etwas zu zeigen. Zu viele Folien. Tut mir leid. So, da sind wir. Ich habe jetzt gezeigt, die Mailware wird am Ende angehängt. Aber einige Beispiele haben die größte Datei nicht verändert und haben sich einfach in bestimmte Bereiche eingenistet. Das kann natürlich unbekannte Konsequenzen haben. Wenn das Programm davon ausgeht, das sind irgendwelche Nullen, dann ist er überrascht. Jetzt haben wir die Mailware drin. Aber im Großen und Ganzen funktioniert das relativ gut. Und es ist halt Antivirus-Software von damals, hat häufig nur die Dateigröße getestet und so konnte man es natürlich gut umgehen. Gibt es Viren, welche versuchen, den Virenscanner zu umgehen? Ja, viele Samples machen das. Sie suchen Dateien von Antivirus-Software. Aber es ist schwierig, solche zu finden. Es gab auch noch nicht so viele Antivirenprodukte damals. Es war jetzt eher so ein Nischen-Ding. Microsoft hat zum Beispiel ein eigenes Antivirus mitgeliefert zu Amistos oder geliefert zu Amistos. Es gab Antivirus-Software, aber die meisten waren wohl nicht so effektiv. Noch weitere Fragen? Es ist interessant, dass das Internet die ganze Zeit über Amistos Fragen stellt. Hast du die Diagramme von Hand gezeichnet oder hast du dafür ein Tool? Oh, so viele Stunden. Es gibt viele gute Tools, als geflaut zum Beispiel. Es sind so super Tools, fantastisch. Es ist aber wahrscheinlich nicht so gut meinteint, unterhalten. Mikrofon Nr. 1? Veröffentlichst du die Tools, die du schreibst? Ich werde die veröffentlichen, wenn sie weniger hässlich sein werden. Ich werde definitiv alle automatischen Malware-Runs veröffentlichen, sodass man danach auch einfach googeln kann. Das Schwierigste daran war überhaupt, Informationen zu bestimmten Viren zu finden, weil man kann nicht einfach googeln wie heutzutage aktuelle. Mikrofon Nr. 1, zuerst? Hast du Viren gefunden, die irgendwie eine Signatur drin hatten, also von einem Auto? Ja, da gibt es viele Beispiele dafür, also viele erweineswerte Beispiele. Viele haben die Viren haben zum Beispiel Namen. Häufig wurde dieser Name encodiert in den Virus. Also dann sieht man, ah man, dieser Virus sollte so und so heißen. Da gibt es ein berühmtes Beispiel, ist die Brain Malware, wo tatsächlich eine Adresse und eine Telefonnummer von dem Autor, ich glaube in Afghanistan, Pakistan, Entschuldigung, drin war. Mikrofon Nr. 2, hat es zur Chance, Viren anzuschauen, die nicht die Dateien verändert hatten, zum Beispiel der größte Virus der Zeit, welcher nur den Master Boot Record verändert hat. Ja, ich habe den Ampere angeschaut, aber da war ein bisschen ein Zeitproblem. Mit diesen Datum-Zeit-Kombinationen zusammen mit Ampere-Anpassungen, ist es nicht so einfach, dass, ja, werde ich in der Zukunft noch machen. Und noch eine Frage aus dem Internet. Ist der Ben X86 Software offen? Kann man es irgendwo im Internet sehen? Wird sie wahrscheinlich sein, ja, wie ich vorhin gesagt, es ist eigentlich halt dafür gesignt, dass es nicht immer richtig funktioniert. Es ist noch nicht so schön. Also, das ist die Feature-Liste davon. Gibt es noch Folgefragen aus dem Internet? Ich weiß nicht, wie ernst das ist, wäre es eine gute Idee, Machine Learning zu benutzen, um neue Dostmalware von den bestehenden Samples zu generieren? Gelächter im Saal. Es war wahrscheinlich keine gute Idee, aber ich mache dir halt, wie du denkst. Ich glaube, ich habe sogar jemanden gesehen, der eine Natural Language Processing benutzt hat, um Viren zu generieren. Man kann eigentlich sogar Markov Chains benutzen dafür. Versuch das nicht zu Hause. Tut es einfach nicht. Ich glaube, das war es damit in den Fragen. Vielen Dank an Ben und damit verabschieden auch wir uns aus.