[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.00,0:00:16.07,Default,,0000,0000,0000,,{\i1}35C3 Vorspannmusik{\i0} Dialogue: 0,0:00:16.07,0:00:25.39,Default,,0000,0000,0000,,Herald: Gut dann wollen jetzt beginnen.\NWer von euch hat schon mal eine E-Mail Dialogue: 0,0:00:25.39,0:00:33.96,Default,,0000,0000,0000,,gekriegt mit einem Anhang? Wer von euch\Nhat eine E-Mail bekommen mit einem Anhang Dialogue: 0,0:00:33.96,0:00:40.41,Default,,0000,0000,0000,,von einer euch unbekannten Person? Das\Nsind erstaunlich wenige, so 20 Prozent. Dialogue: 0,0:00:40.41,0:00:47.67,Default,,0000,0000,0000,,Wer von euch hat den schon mal aufgemacht?\N3, 4. Wer von euch kennt jemanden, der schon Dialogue: 0,0:00:47.67,0:00:55.62,Default,,0000,0000,0000,,mal einen Anhang aufgemacht hat? Ja\Ndeutlich mehr. Wer von euch musste die Dialogue: 0,0:00:55.62,0:01:03.42,Default,,0000,0000,0000,,Probleme beseitigen, die dadurch\Nentstanden sind? Ja auch so 10 20 Prozent Dialogue: 0,0:01:03.42,0:01:12.17,Default,,0000,0000,0000,,würde ich sagen. Ja es ist natürlich eine\Nganz gute Idee, sich zu überlegen, ob man Dialogue: 0,0:01:12.17,0:01:16.22,Default,,0000,0000,0000,,denn jetzt eine Rechnung oder ein Angebot\Nauf machen möchte, was man von einer Dialogue: 0,0:01:16.22,0:01:22.58,Default,,0000,0000,0000,,völlig unbekannten Person aus dem Internet\Nbekommen hat. Und was da passiert, wenn Dialogue: 0,0:01:22.58,0:01:26.66,Default,,0000,0000,0000,,man es tatsächlich täte, das wird uns\Njetzt haggl erläutern. Applaus. Dialogue: 0,0:01:26.66,0:01:30.99,Default,,0000,0000,0000,,{\i1}Applaus{\i0} Dialogue: 0,0:01:30.99,0:01:46.45,Default,,0000,0000,0000,,Haggl: Was? Das sollte so nicht aussehen,\NMoment, warum sagt mir das keiner? Dialogue: 0,0:01:46.45,0:02:15.70,Default,,0000,0000,0000,,So, hallo, dann können wir jetzt ja anfangen.\NJa also danke für die schöne Einleitung. Dialogue: 0,0:02:15.70,0:02:20.69,Default,,0000,0000,0000,,Schön, dass ihr alle da seid, dass ihr so\Nzahlreich erschienen seid. Wie in jedem Dialogue: 0,0:02:20.69,0:02:27.16,Default,,0000,0000,0000,,Jahr eigentlich, gab es auch in 2018 - ich\Nschiebe mal eben die Maus da weg - 2018 Dialogue: 0,0:02:27.16,0:02:31.30,Default,,0000,0000,0000,,wieder ein paar schöne Beispiele, oder\Nschön ist in Anführungszeichen zu setzen, Dialogue: 0,0:02:31.30,0:02:33.56,Default,,0000,0000,0000,,Beispiele von Sicherheitslücken, die\Nziemlich gravierend sind und die Dialogue: 0,0:02:33.56,0:02:40.00,Default,,0000,0000,0000,,geschlossen werden, glücklicherweise,\Ngingen direkt am Anfang des Jahres los. Im Dialogue: 0,0:02:40.00,0:02:43.67,Default,,0000,0000,0000,,Januar wurden im Firefox und mithin auch\Nim tor-Browser, der ja drauf basiert, ein Dialogue: 0,0:02:43.67,0:02:49.91,Default,,0000,0000,0000,,paar Sicherheitslücken geschlossen, \Nfür die man nur eine Webseite besuchen Dialogue: 0,0:02:49.91,0:02:53.91,Default,,0000,0000,0000,,musste und dann sind da intern irgendwelche\NBuffer Overflows passiert und im Dialogue: 0,0:02:53.91,0:02:58.45,Default,,0000,0000,0000,,schlimmsten Fall konnten Angreifer damit\Nhalt beliebigen Code ausführen. Ein Dialogue: 0,0:02:58.45,0:03:01.86,Default,,0000,0000,0000,,weiteres Ding aus diesem Jahr, da habe ich\Nleider keine schöne Pressemitteilung zu Dialogue: 0,0:03:01.86,0:03:07.15,Default,,0000,0000,0000,,gefunden, nur so einen CVE-Artikel. Der\NAdobe Reader, mal wieder, übrigens guckt Dialogue: 0,0:03:07.15,0:03:12.99,Default,,0000,0000,0000,,mal wie viele Sicherheitslücken der hat,\Ndas ist enorm. Da war auch was drin mit Dialogue: 0,0:03:12.99,0:03:17.56,Default,,0000,0000,0000,,einem Buffer Overflow und ebenfalls\Narbitrary code execution. Heißt, ein Dialogue: 0,0:03:17.56,0:03:20.93,Default,,0000,0000,0000,,Angreifer kann beliebigen Code auf dem\NRechner ausführen. Drittes Beispiel, gar Dialogue: 0,0:03:20.93,0:03:26.10,Default,,0000,0000,0000,,nicht so lange her, ist eigentlich im\Nletzten Jahr gewesen, und zwar die beiden Dialogue: 0,0:03:26.10,0:03:31.19,Default,,0000,0000,0000,,Würmer Petya und WannaCry. Das waren so\Nsympathische Ransomwares, die die Dialogue: 0,0:03:31.19,0:03:35.96,Default,,0000,0000,0000,,Festplatte verschlüsseln und den Besitzer\Ndann auffordern, Bitcoins zu überweisen, an Dialogue: 0,0:03:35.96,0:03:40.20,Default,,0000,0000,0000,,eine bestimmte Adresse, damit der Rechner\Nwieder frei geschaltet werden kann. Auch Dialogue: 0,0:03:40.20,0:03:45.78,Default,,0000,0000,0000,,die waren beide, also Teil der Angriffe,\Ndie die genutzt haben, funktionierten über Dialogue: 0,0:03:45.78,0:03:50.06,Default,,0000,0000,0000,,Buffer Overflows. Man sieht also, es ist\Nein Thema mit dem man sehr viel machen Dialogue: 0,0:03:50.06,0:03:55.11,Default,,0000,0000,0000,,kann und deswegen reden wir da jetzt ein\Nbisschen darüber. Das ist der grobe Dialogue: 0,0:03:55.11,0:03:57.76,Default,,0000,0000,0000,,Fahrplan, es gibt jetzt so eine kleine\NVorstellungsrunde, ich sage etwas zu mir, Dialogue: 0,0:03:57.76,0:04:02.35,Default,,0000,0000,0000,,frage was über euch, sag was zum Vortrag.\NDanach machen wir ein paar Grundlagen, die Dialogue: 0,0:04:02.35,0:04:05.83,Default,,0000,0000,0000,,zum Teil sehr technisch und zäh sind, ich\Nbitte das zu entschuldigen, aber ganz ohne Dialogue: 0,0:04:05.83,0:04:12.09,Default,,0000,0000,0000,,geht es leider nicht. Und dann erkläre\Nich, wie halt der Exploit funktioniert, so Dialogue: 0,0:04:12.09,0:04:16.29,Default,,0000,0000,0000,,ein Stack Buffer Overflow Exploit und zum\NSchluss gibt es, wenn die Demo-Götter uns Dialogue: 0,0:04:16.29,0:04:20.32,Default,,0000,0000,0000,,weiter gewogen sind, eine Demonstration,\Nwo ich meinen eigenen Rechner halt mit Dialogue: 0,0:04:20.32,0:04:28.63,Default,,0000,0000,0000,,einem verwundbaren Programm übernehme.\NAlso über mich: Ich bin im Chaos und Dialogue: 0,0:04:28.63,0:04:34.05,Default,,0000,0000,0000,,Hackspace Siegen aktiv und treibe da so\Nein bisschen mein Unwesen, habe so halb Dialogue: 0,0:04:34.05,0:04:38.12,Default,,0000,0000,0000,,den Hut für "Chaos macht Schule" und die\NCryptoparties auf. Wenn es sich nicht Dialogue: 0,0:04:38.12,0:04:42.64,Default,,0000,0000,0000,,vermeiden lässt, mache ich noch\NInfrastruktur und ähnliche Geschichten. In Dialogue: 0,0:04:42.64,0:04:46.53,Default,,0000,0000,0000,,meinem sonstigen Leben bin ich\NInformatiker, ich programmiere kleine Dialogue: 0,0:04:46.53,0:04:52.43,Default,,0000,0000,0000,,Mikrocontroller für Soundsysteme, ich\Nmache Judo und bin Musiker. Meine Dialogue: 0,0:04:52.43,0:04:57.19,Default,,0000,0000,0000,,Lieblingsspeise ist Dal. An dieser stelle\Nherzlichen Dank an das Küchenteam, die uns Dialogue: 0,0:04:57.19,0:05:01.24,Default,,0000,0000,0000,,während dem Aufbau sehr gut verpflegt\Nhaben, unter anderem mit Dal. So, bisschen Dialogue: 0,0:05:01.24,0:05:07.13,Default,,0000,0000,0000,,was über euch. Ein kurzes Funktionscheck:\NWer hört mir zu und ist in der Lage und Dialogue: 0,0:05:07.13,0:05:13.49,Default,,0000,0000,0000,,gewillt, seinen Arm zu heben bei Fragen,\Ndie zutreffen? Das sind ungefähr alle, Dialogue: 0,0:05:13.49,0:05:17.18,Default,,0000,0000,0000,,cool. Dann: Wer weiß, wie so ein Rechner\Naufgebaut ist, Stichwort Dialogue: 0,0:05:17.18,0:05:21.88,Default,,0000,0000,0000,,Rechnerarchitektur, Rechenwerk,\NSteuerwerk, so was? Das sind auch Dialogue: 0,0:05:21.88,0:05:27.13,Default,,0000,0000,0000,,erstaunlich viele, okay. Wer hat schon mal\Nprogrammiert? Im Idealfall mit C, das sind Dialogue: 0,0:05:27.13,0:05:34.03,Default,,0000,0000,0000,,ungefähr alle. Wer hat schon mal gehört,\Nwas ein Stack ist? Was ein Buffer Overflow Dialogue: 0,0:05:34.03,0:05:41.61,Default,,0000,0000,0000,,ist? Wer hat sich bei allem gemeldet? Ihr\Nwerdet euch langweilen! {\i1}lacht{\i0} Der Dialogue: 0,0:05:41.61,0:05:46.60,Default,,0000,0000,0000,,Vortrag ist nämlich, ich habe versucht,\Nihn möglichst einfach zu halten, weil Dialogue: 0,0:05:46.60,0:05:49.47,Default,,0000,0000,0000,,inspiziert inspiriert, entschuldigung,\Ninspiriert ist er von einem Dialogue: 0,0:05:49.47,0:05:52.56,Default,,0000,0000,0000,,Arbeitskollegen, den ich eigentlich für\Nsehr kompetent halte, und der sich auch Dialogue: 0,0:05:52.56,0:05:56.76,Default,,0000,0000,0000,,auskennt mit Mikrocontrollern, mit\NAssemblycode und der mich irgendwann mal Dialogue: 0,0:05:56.76,0:06:01.41,Default,,0000,0000,0000,,fragte, oder mehr im Nebensatz beiläufig\Nerwähnte, dass er nicht verstünde, wie Dialogue: 0,0:06:01.41,0:06:07.61,Default,,0000,0000,0000,,denn eigentlich sein kann, dass ein PDF\Neinen Rechner übernehmen kann. Challenge Dialogue: 0,0:06:07.61,0:06:11.19,Default,,0000,0000,0000,,accepted habe ich mir gedacht, das muss\Nman doch irgendwie erklären können. Und Dialogue: 0,0:06:11.19,0:06:15.42,Default,,0000,0000,0000,,dann habe ich den Vortrag gemacht, habe\Nhier in den Talk eingereicht in Pretalx, Dialogue: 0,0:06:15.42,0:06:18.54,Default,,0000,0000,0000,,der wurde dann halt paar Wochen später\Nauch angenommen, dann habe ich mir den Dialogue: 0,0:06:18.54,0:06:21.33,Default,,0000,0000,0000,,Vortrag, den ich zwei Wochen vorher\Nzusammengeschraubt hatte, noch einmal Dialogue: 0,0:06:21.33,0:06:24.68,Default,,0000,0000,0000,,angeschaut und geprüft, ob er den\NAnforderungen entspricht, die ich mir Dialogue: 0,0:06:24.68,0:06:28.55,Default,,0000,0000,0000,,selber gesetzt habe, festgestellt oh mein\NGott, er ist viel zu technisch. Deswegen Dialogue: 0,0:06:28.55,0:06:31.98,Default,,0000,0000,0000,,habe ich den weiter abgespeckt und\Nversucht, alle nicht nötigen Details, alle Dialogue: 0,0:06:31.98,0:06:34.92,Default,,0000,0000,0000,,nicht nötigen Fachwörter, alles raus zu\Nstreichen, was man nicht unbedingt Dialogue: 0,0:06:34.92,0:06:40.35,Default,,0000,0000,0000,,braucht, um das Prinzip eines Stack Buffer\NOverflows oder ein Exploit dessen zu Dialogue: 0,0:06:40.35,0:06:46.14,Default,,0000,0000,0000,,verstehen. Der Vortrag ist vor 20 Minuten\Nfertig geworden, ich habe ihn noch nie Dialogue: 0,0:06:46.14,0:06:50.76,Default,,0000,0000,0000,,Probe gehalten, ich habe gestern bei der\NDemo zweimal meinen Rechner abgeschossen, Dialogue: 0,0:06:50.76,0:06:55.71,Default,,0000,0000,0000,,insofern bin ich selber sehr gespannt, was\Njetzt passiert. Also fangen wir an. Dialogue: 0,0:06:55.71,0:06:59.79,Default,,0000,0000,0000,,Grundlagen: Wie funktioniert ein Rechner?\NWenn man es ganz ganz ganz ganz grob Dialogue: 0,0:06:59.79,0:07:05.17,Default,,0000,0000,0000,,vereinfacht ausdrückt, gibt es irgendwo\Neinen Prozessor, da kommen auf der einen Dialogue: 0,0:07:05.17,0:07:11.68,Default,,0000,0000,0000,,Seite Daten rein, nämlich Programmdaten,\Nund auf der anderen Seite kommen Daten Dialogue: 0,0:07:11.68,0:07:15.86,Default,,0000,0000,0000,,rein und raus, nämlich die Nutzdaten, die\Nich verarbeiten möchte. Das kann, weiß Dialogue: 0,0:07:15.86,0:07:20.55,Default,,0000,0000,0000,,ich, ein Office-Dokument sein, ein PDF\Noder halt auch Daten aus dem Internet wie Dialogue: 0,0:07:20.55,0:07:27.89,Default,,0000,0000,0000,,HTML-Seiten, bei Web-Browsern sind das halt\Ndie Daten die rein und raus gehen. Daten Dialogue: 0,0:07:27.89,0:07:35.03,Default,,0000,0000,0000,,werden intern im Rechner in dem Speicher\Nabgelegt und zwar in Paketen von acht 1en Dialogue: 0,0:07:35.03,0:07:39.64,Default,,0000,0000,0000,,und 0en. 1en und 0en sind Bits, das wissen\Nja wahrscheinlich alle. So ein Paket von Dialogue: 0,0:07:39.64,0:07:45.42,Default,,0000,0000,0000,,acht davon nennt man ein Byte. Jedes Byte\Nhat eine Adresse im Speicher. Und der Witz Dialogue: 0,0:07:45.42,0:07:49.39,Default,,0000,0000,0000,,ist, dass das hier so, dass was da\Ngezeichnet ist, nicht ganz korrekt ist, Dialogue: 0,0:07:49.39,0:07:53.66,Default,,0000,0000,0000,,denn Programme und Daten liegen im\Ngleichen Speicher. Das heißt, ich kann es Dialogue: 0,0:07:53.66,0:07:57.90,Default,,0000,0000,0000,,theoretisch schaffen, den Prozessor dazu\Nzu bringen, Programme auszuführen aus dem Dialogue: 0,0:07:57.90,0:08:02.24,Default,,0000,0000,0000,,Speicherbereich, wo eigentlich Daten\Nliegen sollten. Das ist schon eigentlich Dialogue: 0,0:08:02.24,0:08:10.14,Default,,0000,0000,0000,,wie letztendlich so ein Buffer Overflow\NExploit funktioniert. Wenn ich den Dialogue: 0,0:08:10.14,0:08:13.58,Default,,0000,0000,0000,,Prozessor da in der Mitte doch noch mal\Nein bisschen aufbohre, dann sehe ich, dass Dialogue: 0,0:08:13.58,0:08:18.85,Default,,0000,0000,0000,,er da drin so einen Registersatz hat. Man\Nnennt das so, Register. Das ist so ein Dialogue: 0,0:08:18.85,0:08:23.94,Default,,0000,0000,0000,,bisschen vergleichbar mit dem, man könnte\Nsagen, das Kurzzeitgedächtnis von Dialogue: 0,0:08:23.94,0:08:28.58,Default,,0000,0000,0000,,Menschen, man sagt Menschen ja nach, sie\Nkönnten sich so größenordnungsmäßig 7 Dialogue: 0,0:08:28.58,0:08:33.83,Default,,0000,0000,0000,,Dinge gleichzeitig merken, kurzzeitig. So\Nähnlich ist das bei einem Prozessor auch, Dialogue: 0,0:08:33.83,0:08:38.83,Default,,0000,0000,0000,,der hat einen sehr begrenzten Satz von\NRegistern, also Speicherzellen, die sehr Dialogue: 0,0:08:38.83,0:08:43.16,Default,,0000,0000,0000,,schnell sind, aber halt auch sehr teuer\Nsind. Deswegen baut man da nicht so viele Dialogue: 0,0:08:43.16,0:08:46.40,Default,,0000,0000,0000,,von, das sind die Register. Und dann merkt\Ner sich halt zum Beispiel, wo er im Dialogue: 0,0:08:46.40,0:08:54.07,Default,,0000,0000,0000,,Programm gerade steht. Also wo im\NProgrammspeicher er gerade steht oder wo Dialogue: 0,0:08:54.07,0:08:59.42,Default,,0000,0000,0000,,der Stack gerade steht. Der Stack ist ein\Nbesonderer Speicherbereich im Dialogue: 0,0:08:59.42,0:09:04.87,Default,,0000,0000,0000,,Datenspeicher, also eigentlich kein\NProgrammspeicher, der verwendet wird um Dialogue: 0,0:09:04.87,0:09:10.01,Default,,0000,0000,0000,,Dinge längerfristig abzulegen, also man\Nkönnte sagen Langzeitgedächtnis. Naja es Dialogue: 0,0:09:10.01,0:09:14.41,Default,,0000,0000,0000,,stimmt nicht ganz, aber grob. Und der\NStack ist wirklich, der Name ist Programm, Dialogue: 0,0:09:14.41,0:09:17.55,Default,,0000,0000,0000,,ist wie ein Stapel, ich lege unten was\Ndrauf, dann lege ich was oben drauf, lege Dialogue: 0,0:09:17.55,0:09:20.88,Default,,0000,0000,0000,,etwas weiteres oben drauf, und ich lege\Nauch Dinge oder hole Dinge genau in der Dialogue: 0,0:09:20.88,0:09:26.83,Default,,0000,0000,0000,,umgekehrten Reihenfolge wieder runter.\NAlso wie ein Stapel Papier eigentlich. Der Dialogue: 0,0:09:26.83,0:09:31.85,Default,,0000,0000,0000,,wird gebraucht, um bestimmte Features von\NProgrammiersprachen zu implementieren, das Dialogue: 0,0:09:31.85,0:09:35.75,Default,,0000,0000,0000,,werden wir gleich noch sehen. Wenn jetzt\Nalso so ein Programm abläuft, also links Dialogue: 0,0:09:35.75,0:09:39.97,Default,,0000,0000,0000,,sieht man einen Ausschnitt aus dem\NProgrammspeicher. Also ich habe da jetzt Dialogue: 0,0:09:39.97,0:09:43.76,Default,,0000,0000,0000,,byteweise mal irgendwelche random\NZahlen hingemalt. Naja es sind keine Dialogue: 0,0:09:43.76,0:09:47.67,Default,,0000,0000,0000,,random Zahlen, es ist tatsächlich ein Teil\Neines Shell-Codes. Also von dem Ding, was Dialogue: 0,0:09:47.67,0:09:52.26,Default,,0000,0000,0000,,ich gleich benutze, um meinen Rechner\Naufzumachen. Die sind jetzt von oben nach Dialogue: 0,0:09:52.26,0:09:56.01,Default,,0000,0000,0000,,unten byteweise aufgelistet und man würde\Njetzt sehen, also Speicheradressen gehen Dialogue: 0,0:09:56.01,0:09:59.75,Default,,0000,0000,0000,,jetzt hier von oben nach unten. Das heißt,\Noben sind die niedrigen Speicheradressen, Dialogue: 0,0:09:59.75,0:10:03.30,Default,,0000,0000,0000,,unten sind die hohen Speicheradressen. Und\Ndie werden einfach der Reihe nach Dialogue: 0,0:10:03.30,0:10:07.33,Default,,0000,0000,0000,,durchgezählt, jedes Byte hat halt so eine\NAdresse. Und so weiß der Prozessor genau, Dialogue: 0,0:10:07.33,0:10:11.38,Default,,0000,0000,0000,,wenn er gesagt bekommt, macht mal hier an\Nder und der Stelle im Programmcode weiter, Dialogue: 0,0:10:11.38,0:10:15.94,Default,,0000,0000,0000,,dann springt er halt dahin und liest\Nweiter. Und zwar sieht das so aus, da Dialogue: 0,0:10:15.94,0:10:22.26,Default,,0000,0000,0000,,werden halt Dinge, also dass der Opcode\Noder der Befehl, der gerade ausgeführt Dialogue: 0,0:10:22.26,0:10:25.39,Default,,0000,0000,0000,,werden soll, wird eingelesen und wird\Nausgeführt und der könnte dann zum Dialogue: 0,0:10:25.39,0:10:30.91,Default,,0000,0000,0000,,Beispiel so etwas machen wie ein Datum aus\Ndem Registersatz in den Stack legen oder Dialogue: 0,0:10:30.91,0:10:34.72,Default,,0000,0000,0000,,auf den Stack oben drauf legen. Im\Nnächsten Schritt wird dann etwas anderes Dialogue: 0,0:10:34.72,0:10:38.64,Default,,0000,0000,0000,,oben draufgelegt und dann wird da wieder\Nwas runtergeholt und wieder zurück in das Dialogue: 0,0:10:38.64,0:10:41.90,Default,,0000,0000,0000,,Register geschrieben, möglicherweise noch\Nirgendwomit verrechnet und so, hangelt er Dialogue: 0,0:10:41.90,0:10:48.23,Default,,0000,0000,0000,,sich halt durch den Code durch. Von oben\Nnach unten. Man sieht auch, es muss nicht Dialogue: 0,0:10:48.23,0:10:54.37,Default,,0000,0000,0000,,unbedingt immer alles, jedes Ding muss\Nnicht auch ein Befehl sein, da sind auch Dialogue: 0,0:10:54.37,0:10:59.50,Default,,0000,0000,0000,,Daten dazwischen. In diesem Fall halt das,\Nwas auf den Stack gelegt wurde. Aber im Dialogue: 0,0:10:59.50,0:11:02.11,Default,,0000,0000,0000,,Prinzip funktioniert das so. Ein Rechner\Ngeht einfach der Reihe nach die Befehle Dialogue: 0,0:11:02.11,0:11:04.47,Default,,0000,0000,0000,,durch. Es gibt dann halt auch\NSprungbefehle, die sagen können: springe Dialogue: 0,0:11:04.47,0:11:08.79,Default,,0000,0000,0000,,mal irgendwie zurück oder springe mal vor,\Naber im Prinzip ist das alles was ein Dialogue: 0,0:11:08.79,0:11:16.66,Default,,0000,0000,0000,,Rechner macht. Okay, der Shell Code, den\Nich gleich benutzen werde, sieht so aus. Dialogue: 0,0:11:16.66,0:11:21.66,Default,,0000,0000,0000,,Das ist offensichtlich ein Programm, was\Nden laufenden Prozess beendet und eine Dialogue: 0,0:11:21.66,0:11:26.93,Default,,0000,0000,0000,,Shell mit dem Namen "sh" startet. Nun ist\Ndas natürlich nicht so offensichtlich, so Dialogue: 0,0:11:26.93,0:11:29.51,Default,,0000,0000,0000,,will ja keiner Code schreiben. Deswegen\Nhaben sich Leute einfallen lassen: Hey, Dialogue: 0,0:11:29.51,0:11:33.93,Default,,0000,0000,0000,,wir müssen irgendwie es schaffen, was\Nlesbareres zu bekommen und außerdem würden Dialogue: 0,0:11:33.93,0:11:36.50,Default,,0000,0000,0000,,wir ganz gerne, wenn wir ein Programm\Ngeschrieben haben, das nicht für jeden Dialogue: 0,0:11:36.50,0:11:40.25,Default,,0000,0000,0000,,Prozessor dieser Welt neu schreiben\Nmüssen. Weil das da ist Code, der nur auf Dialogue: 0,0:11:40.25,0:11:45.86,Default,,0000,0000,0000,,diesem Prozessor, in diesem Fall ein x86\NProzessor ,läuft. Wenn ich versuche, den Dialogue: 0,0:11:45.86,0:11:49.40,Default,,0000,0000,0000,,auf einem ARM-Prozesor laufen zu lassen,\Ndann sagt er: Kenne ich nicht den Befehl, Dialogue: 0,0:11:49.40,0:11:56.31,Default,,0000,0000,0000,,mache ich nicht. Beides erreicht man mit\Nsogenannten höheren Programmiersprachen. Dialogue: 0,0:11:56.31,0:12:03.35,Default,,0000,0000,0000,,Eine davon ist C. Das gleiche Programm\Nsieht in C so aus. Und hier kann man schon Dialogue: 0,0:12:03.35,0:12:06.45,Default,,0000,0000,0000,,einigermaßen erkennen, okay hier ist\Nirgendwie ein String drin, offensichtlich Dialogue: 0,0:12:06.45,0:12:12.88,Default,,0000,0000,0000,,also eine Zeichenkette die auf /bin/sh\Nzeigt. Das ist für Leute, die Unix kennen, Dialogue: 0,0:12:12.88,0:12:17.74,Default,,0000,0000,0000,,die Standard Shell. Also ein\NKommandozeileninterpreter. Und darunter ist Dialogue: 0,0:12:17.74,0:12:22.66,Default,,0000,0000,0000,,eine Zeile, naja die ist wirklich sehr\Nkryptisch, die muss man schon kennen. Es Dialogue: 0,0:12:22.66,0:12:26.49,Default,,0000,0000,0000,,ruft halt das Programm auf. Aber wie\Ngesagt, Menschen, die sich damit ein Dialogue: 0,0:12:26.49,0:12:29.76,Default,,0000,0000,0000,,bisschen auskennen, die können so etwas\Ndirekt auf Anhieb lesen, das da oben Dialogue: 0,0:12:29.76,0:12:35.39,Default,,0000,0000,0000,,natürlich nicht. Dieser Code wird jetzt in\Neinen sogenannten Compiler reingeschmissen Dialogue: 0,0:12:35.39,0:12:43.07,Default,,0000,0000,0000,,und der Compiler macht dann aus dem\NUnteren ungefähr das Obere wieder. Zudem Dialogue: 0,0:12:43.07,0:12:47.13,Default,,0000,0000,0000,,gibt es dann, wenn man schon so eine\Nschöne Abstraktion hat, noch Dialogue: 0,0:12:47.13,0:12:51.23,Default,,0000,0000,0000,,Programmbibliotheken, dass man nicht jeden\NScheiß neu machen muss. So was wie: öffne Dialogue: 0,0:12:51.23,0:12:55.12,Default,,0000,0000,0000,,mir eine Datei und lies den Inhalt. Das\Nwill ich ja nicht jedes mal auf der Ebene Dialogue: 0,0:12:55.12,0:12:59.99,Default,,0000,0000,0000,,neu programmieren. Deswegen lege ich mir\Ndafür schöne Bibliotheken an, mit Dialogue: 0,0:12:59.99,0:13:04.92,Default,,0000,0000,0000,,Funktionen. Funktionen sind Teile also\Nwieder verwertbare Programmteile, die Dialogue: 0,0:13:04.92,0:13:08.83,Default,,0000,0000,0000,,einen definierten Satz von\NEingabeparametern haben. Also ich kann Dialogue: 0,0:13:08.83,0:13:13.58,Default,,0000,0000,0000,,einer Datei-öffnen-Funktionen\Nbeispielsweise mitgeben, wo die Datei sich Dialogue: 0,0:13:13.58,0:13:16.93,Default,,0000,0000,0000,,befindet im Dateisystem und ob ich sie\Nlesend schreiben (öffnen) möchte oder schreibend Dialogue: 0,0:13:16.93,0:13:23.48,Default,,0000,0000,0000,,oder beides. Dann haben die einen\NFunktionsrumpf. Das ist der Teil der Dialogue: 0,0:13:23.48,0:13:27.26,Default,,0000,0000,0000,,Funktionen, der was macht. Der also das\Ntut, was die Funktion tun soll mit den Dialogue: 0,0:13:27.26,0:13:31.26,Default,,0000,0000,0000,,Eingangsparametern und dann gibt es noch\Neinen Return-Wert, dass ist also ein Dialogue: 0,0:13:31.26,0:13:34.13,Default,,0000,0000,0000,,Rückgabewert, den die Funktion dann zurück\Ngibt, wenn sie fertig ist mit was immer Dialogue: 0,0:13:34.13,0:13:38.86,Default,,0000,0000,0000,,sie getan hat. Und auf diese Weise baut\Nman sich halt Bibliotheken und verwendet Dialogue: 0,0:13:38.86,0:13:41.93,Default,,0000,0000,0000,,die halt immer wieder. Dieses execve ganz\Nunten ist beispielsweise eine Dialogue: 0,0:13:41.93,0:13:47.80,Default,,0000,0000,0000,,Bibliotheksfunktion. Und das war im\NPrinzip schon alles, was wir für den Dialogue: 0,0:13:47.80,0:13:59.83,Default,,0000,0000,0000,,Exploit wissen müssen. Wenn nämlich jetzt\Nso eine Funktionen aufgerufen wird. Nehmen Dialogue: 0,0:13:59.83,0:14:05.64,Default,,0000,0000,0000,,wir mal an, wir hätten eine Funktion, die\Ndrei Parameter hat, einer davon ist, ach Dialogue: 0,0:14:05.64,0:14:09.51,Default,,0000,0000,0000,,Quatsch. Zwei Parameter hat,\Nentschuldigung, und drei lokale Variablen. Dialogue: 0,0:14:09.51,0:14:13.38,Default,,0000,0000,0000,,Achso, Variable habe ich gar nicht\Nerklärt. Variablen ist auch ein Konzept Dialogue: 0,0:14:13.38,0:14:17.97,Default,,0000,0000,0000,,von Programmiersprachen. Da kann ich halt\NSpeicheradressen sprechende Namen geben. Dialogue: 0,0:14:17.97,0:14:24.33,Default,,0000,0000,0000,,Dass ich halt als Programmierer sehen kann,\Nwo ich was abgelegt habe. Und Funktionen Dialogue: 0,0:14:24.33,0:14:29.16,Default,,0000,0000,0000,,können lokale Variablen haben. Davon\Nbeliebig viele und die werden eben über Dialogue: 0,0:14:29.16,0:14:32.35,Default,,0000,0000,0000,,einen Stack abgebildet, genauso wie die\NFunktionsparameter über einen Stack Dialogue: 0,0:14:32.35,0:14:36.40,Default,,0000,0000,0000,,abgebildet werden und der Rückgabewert\Nweiß ich jetzt gerade nicht, da will ich Dialogue: 0,0:14:36.40,0:14:40.70,Default,,0000,0000,0000,,nichts falsches sagen. Könnte sein, dass\Nder auch über einen Stack läuft, bin ich Dialogue: 0,0:14:40.70,0:14:45.16,Default,,0000,0000,0000,,mir aber gerade nicht sicher. Nein, ich\Nglaube, läuft er nicht, whatever. Wenn ich Dialogue: 0,0:14:45.16,0:14:48.51,Default,,0000,0000,0000,,jetzt mir eine Funktion vorstelle, die\Nzwei Parameter hat und drei lokale Dialogue: 0,0:14:48.51,0:14:54.86,Default,,0000,0000,0000,,Variablen. Davon soll eine ein Buffer\Nsein, dann passiert, wenn die Funktion Dialogue: 0,0:14:54.86,0:14:59.77,Default,,0000,0000,0000,,aufgerufen wird, folgendes: Zuerst werden\Ndie Funktionsargumente oder Parameter auf Dialogue: 0,0:14:59.77,0:15:06.01,Default,,0000,0000,0000,,den Stack gelegt, und zwar in umgekehrter\NReihenfolge. Fragt nicht, ist so. Danach Dialogue: 0,0:15:06.01,0:15:10.59,Default,,0000,0000,0000,,wird die momentane Adresse oder die\Nnächste Adresse auf den Stack gelegt, Dialogue: 0,0:15:10.59,0:15:15.22,Default,,0000,0000,0000,,damit das Programm weiß, wenn es aus der\NFunktion zurückkommt, wo es weitermachen Dialogue: 0,0:15:15.22,0:15:21.42,Default,,0000,0000,0000,,muss, weil es folgt ja ein Sprung. Dann\Nkommt noch was, das uns nicht interessiert Dialogue: 0,0:15:21.42,0:15:26.69,Default,,0000,0000,0000,,und dann kommen die lokalen Variablen der\NFunktion selber. In diesem Fall eine Dialogue: 0,0:15:26.69,0:15:30.12,Default,,0000,0000,0000,,Variable, dann kommt ein Buffer und dann\Nkommt noch eine Variable. An dieser Stelle Dialogue: 0,0:15:30.12,0:15:32.33,Default,,0000,0000,0000,,ist sehr schön zu erklären, was ein\NBuffer ist. Ein Buffer ist Dialogue: 0,0:15:32.33,0:15:39.49,Default,,0000,0000,0000,,eigentlich nichts anderes als eine\NVariable, die aber mehr Speicher hat. Dialogue: 0,0:15:39.49,0:15:44.03,Default,,0000,0000,0000,,Also das ist jetzt nicht eine Zahl,\Nsondern es sind beispielsweise 512 Zahlen Dialogue: 0,0:15:44.03,0:15:49.72,Default,,0000,0000,0000,,der gleichen Größe. Das ist ein Buffer.\NDas hier wäre zum Beispiel jetzt ein Dialogue: 0,0:15:49.72,0:15:56.35,Default,,0000,0000,0000,,Buffer der Größe 5. 5 Bytes groß. Die\Nkönnen beliebig groß sein, wobei beliebig Dialogue: 0,0:15:56.35,0:16:00.52,Default,,0000,0000,0000,,ist nicht ganz richtig. Hängt von der\NSpeichergröße ab, wie ich gestern gelernt Dialogue: 0,0:16:00.52,0:16:07.57,Default,,0000,0000,0000,,habe, bei der Demo. {\i1}lacht{\i0} Ja, aber im\NPrinzip sind die nicht begrenzt und das Dialogue: 0,0:16:07.57,0:16:09.93,Default,,0000,0000,0000,,Schlimme ist, man muss sich wenn man so\Nlow level programmiert, selber darum Dialogue: 0,0:16:09.93,0:16:15.68,Default,,0000,0000,0000,,kümmern, dass man die Grenzen einhält und\Nnicht zu viel da rein schreibt. Und dann Dialogue: 0,0:16:15.68,0:16:23.09,Default,,0000,0000,0000,,sind wir schon beim Programm. Das Rechte\Nist das C Program, was ich exploite. Das Dialogue: 0,0:16:23.09,0:16:28.16,Default,,0000,0000,0000,,ist relativ überschaubar, oben diese Zeile\N"int main", das kann man ignorieren, dass Dialogue: 0,0:16:28.16,0:16:32.88,Default,,0000,0000,0000,,braucht man halt, um C zu sagen: hier\Nbeginnt das Programm, hier geht es los und Dialogue: 0,0:16:32.88,0:16:37.53,Default,,0000,0000,0000,,es ist aber wichtig zu wissen, dass main\Nbereits eine Funktion ist. Also vorher Dialogue: 0,0:16:37.53,0:16:44.42,Default,,0000,0000,0000,,passieren noch andere Dinge, die wir nicht\Ngenauer betrachten, die mir aber sehr Dialogue: 0,0:16:44.42,0:16:49.12,Default,,0000,0000,0000,,viele Steine in den Weg gelegt haben\Ngestern. {\i1}lacht{\i0} Die rufen am Ende dann Dialogue: 0,0:16:49.12,0:16:55.21,Default,,0000,0000,0000,,halt diese Funktion main auf. Es ist also\Nein ganz normaler Funktionsaufruf. Die Dialogue: 0,0:16:55.21,0:16:58.24,Default,,0000,0000,0000,,Funktion main hat jetzt eine lokale\NVariable, nämlich den Buffer der Größe Dialogue: 0,0:16:58.24,0:17:02.28,Default,,0000,0000,0000,,256. Das ist nicht mehr ganz aktuell, in\Nder Demo, die ich gleich zeige, ist er ein Dialogue: 0,0:17:02.28,0:17:07.62,Default,,0000,0000,0000,,bisschen größer, spielt aber keine Rolle.\NDanach gibt es eine Bibliotheksfunktion Dialogue: 0,0:17:07.62,0:17:15.42,Default,,0000,0000,0000,,string copy, strcpy. Die kopiert, was\Nimmer in argv[1] liegt. Da muss man jetzt Dialogue: 0,0:17:15.42,0:17:20.08,Default,,0000,0000,0000,,dazu sagen, das ist ein\NKommandozeilenparameter. Wenn ich ein Dialogue: 0,0:17:20.08,0:17:23.25,Default,,0000,0000,0000,,Programm aufrufe auf der Kommandozeile,\Nkann ich dem noch Argumente mitgeben und Dialogue: 0,0:17:23.25,0:17:27.29,Default,,0000,0000,0000,,das erste Argument, was ich dem mitgebe in\Ndiesem Fall, würde halt in den Buffer Dialogue: 0,0:17:27.29,0:17:33.84,Default,,0000,0000,0000,,kopiert. Danach wird eine nette Nachricht\Nausgegeben "Hallo, was immer in dem Buffer Dialogue: 0,0:17:33.84,0:17:38.52,Default,,0000,0000,0000,,steht" und dann folgt das return. Sprich,\Ndie Funktionen kehrt zurück und dieser Dialogue: 0,0:17:38.52,0:17:43.13,Default,,0000,0000,0000,,ganze Stack wird abgeräumt und der\NProzessor springt dahin, an die Stelle, Dialogue: 0,0:17:43.13,0:17:48.11,Default,,0000,0000,0000,,deren Adresse jetzt in return links rot\Nmarkiert steht. Also weil vorher hat sich Dialogue: 0,0:17:48.11,0:17:51.62,Default,,0000,0000,0000,,ja das Programm gemerkt, wo es nachher hin\Nzurück muss, indem es die Adresse extra da Dialogue: 0,0:17:51.62,0:17:56.47,Default,,0000,0000,0000,,hingelegt hat. Und wenn ich jetzt zu viele\NDaten in diesen Buffer rein schreibe, der Dialogue: 0,0:17:56.47,0:18:01.04,Default,,0000,0000,0000,,ist links verkürzt dargestellt, also\Njetzt die letzten 5 Bytes von diesem 256 Dialogue: 0,0:18:01.04,0:18:05.52,Default,,0000,0000,0000,,Bytes Buffer, wenn ich jetzt zu viele\NDaten da reinschreibe, dann kommt Dialogue: 0,0:18:05.52,0:18:10.08,Default,,0000,0000,0000,,irgendwann der Punkt, wo ich halt die\Nletzten paar Bytes überschreibe. Dann Dialogue: 0,0:18:10.08,0:18:13.00,Default,,0000,0000,0000,,überschreibe ich das Ding, was uns nicht\Ninteressiert und irgendwann überschreibe Dialogue: 0,0:18:13.00,0:18:19.15,Default,,0000,0000,0000,,ich die Return-Adresse. Was jetzt\Npassiert, erst mal noch nichts. Dann kommt Dialogue: 0,0:18:19.15,0:18:26.35,Default,,0000,0000,0000,,das return 0 und was das return macht: Es\Nlädt was immer an dieser stelle steht Dialogue: 0,0:18:26.35,0:18:29.67,Default,,0000,0000,0000,,zurück in den instruction pointer, also an\Ndie Stelle, wo sich der Prozessor intern Dialogue: 0,0:18:29.67,0:18:34.88,Default,,0000,0000,0000,,merkt, wo das Programm gerade steht und\Nmacht an der Stelle weiter. Wenn ich es Dialogue: 0,0:18:34.88,0:18:41.82,Default,,0000,0000,0000,,jetzt schaffe, in diesen Buffer meinen\NShell Code reinzuladen, also das kleine Dialogue: 0,0:18:41.82,0:18:45.81,Default,,0000,0000,0000,,Programmstück, was ihr eben gesehen habt,\Nwas das laufende Programm beendet und ein Dialogue: 0,0:18:45.81,0:18:49.23,Default,,0000,0000,0000,,neues Programm, nämlich einen\NKommandozeileninterpreter startet, wenn Dialogue: 0,0:18:49.23,0:18:53.06,Default,,0000,0000,0000,,ich das jetzt schaffe das da oben rein zu\Nschreiben und zudem noch es schaffe, an Dialogue: 0,0:18:53.06,0:19:00.43,Default,,0000,0000,0000,,die Return-Adresse den Anfang von diesem\NCode reinzuschreiben, dann passiert genau, Dialogue: 0,0:19:00.43,0:19:04.28,Default,,0000,0000,0000,,was nicht passieren darf: Nämlich das\NProgramm macht, was ich ihm vorher gesagt Dialogue: 0,0:19:04.28,0:19:10.62,Default,,0000,0000,0000,,habe und was ich vorher in diesem Buffer\Nreingeschrieben habe. Und jetzt kommt der Dialogue: 0,0:19:10.62,0:19:16.13,Default,,0000,0000,0000,,Punkt, an dem es interessant wird. Jetzt\Nmuss ich erst mal meine Maus wiederfinden, Dialogue: 0,0:19:16.13,0:19:41.53,Default,,0000,0000,0000,,dass habe ich mir alles anders\Nvorgestellt. Sieht man das? Das ist ein Dialogue: 0,0:19:41.53,0:19:57.44,Default,,0000,0000,0000,,bisschen klein. Könnt ihr das\Nlesen, nein oder? Da hinten, könnt ihr Dialogue: 0,0:19:57.44,0:20:05.57,Default,,0000,0000,0000,,das da hinten lesen? Nein. Bis gerade eben\Nkonnte ich auch noch die Größe von meinem Dialogue: 0,0:20:05.57,0:20:15.07,Default,,0000,0000,0000,,Terminal verstellen. Das scheint jetzt\Nnicht mehr zu gehen. Aha, geht nur auf dem Dialogue: 0,0:20:15.07,0:20:26.14,Default,,0000,0000,0000,,linken Bildschirm, aus Gründen! Könnt ihr\Ndas jetzt einigermaßen lesen? Gut. Also Dialogue: 0,0:20:26.14,0:20:36.64,Default,,0000,0000,0000,,ich habe hier dieses Programm, ich habe\Ndas mal vorbereitet. Es macht, was es Dialogue: 0,0:20:36.64,0:20:40.50,Default,,0000,0000,0000,,soll, es liest halt den ersten Parameter\Nein, also "vuln" ist das Programm, das Dialogue: 0,0:20:40.50,0:20:44.13,Default,,0000,0000,0000,,verwundbar ist. Ich habe ihm den Parameter\N"haggl" mit gegeben, also sagt das "Hallo, Dialogue: 0,0:20:44.13,0:20:49.74,Default,,0000,0000,0000,,haggl", alles cool. Wenn ich jetzt aber\NDinge da rein schreibe, die ein bisschen Dialogue: 0,0:20:49.74,0:21:09.53,Default,,0000,0000,0000,,länger sind, beispielsweise so etwas. Ich\Nhoffe, das ist die richtige Syntax um in Dialogue: 0,0:21:09.53,0:21:14.67,Default,,0000,0000,0000,,Python Dinge auf der Kommandozeile direkt\Nauszuführen. Ja. Dann kriege ich einen Dialogue: 0,0:21:14.67,0:21:18.18,Default,,0000,0000,0000,,segmentation fault. Ein segmentation fault\Nist der nette Hinweis vom Dialogue: 0,0:21:18.18,0:21:22.36,Default,,0000,0000,0000,,Betriebssystemen: Kollege, du hast gerade\NSpeicher lesen und/oder schreiben wollen, Dialogue: 0,0:21:22.36,0:21:29.75,Default,,0000,0000,0000,,auf den du keinen Zugriff hast. Wenn Leute\Ndie Exploits schreiben, so etwas kriegen, Dialogue: 0,0:21:29.75,0:21:33.36,Default,,0000,0000,0000,,also das ist das was normalerweise das\Nkennt wahrscheinlich jeder, was passiert Dialogue: 0,0:21:33.36,0:21:36.19,Default,,0000,0000,0000,,wenn ein Programm einfach so ohne\Nirgendetwas zu sagen abstürzt, dann ist Dialogue: 0,0:21:36.19,0:21:40.81,Default,,0000,0000,0000,,das oft ein segmentation fault. Das ist\Nfür die meisten Menschen sehr nervig, weil Dialogue: 0,0:21:40.81,0:21:43.46,Default,,0000,0000,0000,,man dann das Programm neu starten muss,\Ngegebenenfalls Daten verloren gegangen Dialogue: 0,0:21:43.46,0:21:47.60,Default,,0000,0000,0000,,sind. für Leute, die Exploits schreiben,\Nist das der heilige Gral, weil Dialogue: 0,0:21:47.60,0:21:52.77,Default,,0000,0000,0000,,segmentation faults sind oft ein Indiz\Ndafür, dass es da gerade einen Buffer Dialogue: 0,0:21:52.77,0:21:56.20,Default,,0000,0000,0000,,Overflow gegeben hat. Und ein Buffer\NOverflow, damit kann man eine Menge Dialogue: 0,0:21:56.20,0:22:10.76,Default,,0000,0000,0000,,anfangen. Man kann beispielsweise einen\NShell Code reinladen. xxd -p shellcode, Dialogue: 0,0:22:10.76,0:22:15.54,Default,,0000,0000,0000,,das ist das Ding, was wir eben in den\NSlides gesehen haben. Das ist also dieses Dialogue: 0,0:22:15.54,0:22:21.84,Default,,0000,0000,0000,,Programm in Maschinencode, was das\Nlaufende Programm beendet und eine Shell Dialogue: 0,0:22:21.84,0:22:29.78,Default,,0000,0000,0000,,startet. Und wenn ich die jetzt da rein\Ninjecte, also anstatt jetzt diesem Dialogue: 0,0:22:29.78,0:22:39.15,Default,,0000,0000,0000,,Pythonding oder dem einfachen String\Nhaggl, dieses Teil jetzt da rein pipe, Dialogue: 0,0:22:39.15,0:22:44.38,Default,,0000,0000,0000,,dann bekomme ich eine Shell. Und zwar eine\NShell, die nicht die andere Shell ist, Dialogue: 0,0:22:44.38,0:22:50.12,Default,,0000,0000,0000,,sondern eine neue Shell ist. An der Stelle\Nhabe ich es geschafft. Jetzt bin ich halt Dialogue: 0,0:22:50.12,0:22:55.73,Default,,0000,0000,0000,,drin und kann hier auf dem System\Nbeliebige Dinge machen. Das ist erstmal so Dialogue: 0,0:22:55.73,0:23:01.32,Default,,0000,0000,0000,,noch nicht so schlimm und das ist ja auch\Nein sehr akademisches Beispiel, weil ich Dialogue: 0,0:23:01.32,0:23:03.86,Default,,0000,0000,0000,,es alles selber geschrieben habe. Ich muss\Nauf dem eigenen Rechner sein, ich bin eh Dialogue: 0,0:23:03.86,0:23:08.33,Default,,0000,0000,0000,,schon der Benutzer, aber interessant wird\Nes natürlich, wenn so eine Verwundbarkeit Dialogue: 0,0:23:08.33,0:23:11.92,Default,,0000,0000,0000,,irgendwo an der Stelle sitzt, die auf das\NNetzwerk horcht. Wenn man von außen Dialogue: 0,0:23:11.92,0:23:16.53,Default,,0000,0000,0000,,irgendwie Pakete einschleusen kann, die so\Netwas hervorrufen. Und ich dann irgendwie Dialogue: 0,0:23:16.53,0:23:20.34,Default,,0000,0000,0000,,eine Shell oder ähnliches bekomme. Auch\Ninteressant wird es, wenn das ein Dienst Dialogue: 0,0:23:20.34,0:23:24.07,Default,,0000,0000,0000,,ist, der aus Gründen mit root-Rechten\Nlaufen muss. Dann habe ich nämlich auf Dialogue: 0,0:23:24.07,0:23:28.69,Default,,0000,0000,0000,,einmal eine root-Shell. Und so weiter und\Nso fort. Also man kann da eine Menge Dialogue: 0,0:23:28.69,0:23:36.11,Default,,0000,0000,0000,,lustige Sachen mit machen. Ich habe noch\Netwas anderes vorbereitet. Und zwar, wenn Dialogue: 0,0:23:36.11,0:23:40.05,Default,,0000,0000,0000,,ich jetzt einen Debugger über das Ding\Nlaufen lassen. Ein Debugger ist ein Dialogue: 0,0:23:40.05,0:23:45.34,Default,,0000,0000,0000,,Programm, mit dem ich zur Laufzeit rein\Ngucken kann, in den Speicher, und schauen Dialogue: 0,0:23:45.34,0:23:49.02,Default,,0000,0000,0000,,kann, was denn der Prozess so gerade da\Nmacht, und was wo an welcher Stelle im Dialogue: 0,0:23:49.02,0:23:53.41,Default,,0000,0000,0000,,Speicher geschrieben wird. Hier sehe ich\Njetzt noch mal den Quellcode von dem Dialogue: 0,0:23:53.41,0:23:56.31,Default,,0000,0000,0000,,Programm. Das ist das gleiche wie eben,\Nbis auf das der Buffer ein bisschen größer Dialogue: 0,0:23:56.31,0:24:03.51,Default,,0000,0000,0000,,ist. Das spielt aber keine große Rolle und\Nich habe zwei breakpoints gesetzt. Dialogue: 0,0:24:03.51,0:24:07.05,Default,,0000,0000,0000,,Breakpoint heißt, das Programm oder der\NDebugger vielmehr, hält das Programm an Dialogue: 0,0:24:07.05,0:24:12.55,Default,,0000,0000,0000,,der Stelle an, damit man halt schauen\Nkann, was an bestimmten Speicheradressen Dialogue: 0,0:24:12.55,0:24:18.44,Default,,0000,0000,0000,,steht. Und einer ist hier auf dieser Zeile\Nstringcopy, Zeile 6. Also der macht, hält Dialogue: 0,0:24:18.44,0:24:23.81,Default,,0000,0000,0000,,an bevor das reinkopiert wurde, und der\Nnächste breakpoint hält kurz vor dem Dialogue: 0,0:24:23.81,0:24:27.24,Default,,0000,0000,0000,,return an. Und da müsste ich halt dann\Nschon sehen, was im Buffer passiert ist. Dialogue: 0,0:24:27.24,0:24:31.76,Default,,0000,0000,0000,,Wenn ich das Programm jetzt laufen lasse,\Nmit den richtigen Argumenten, das ist Dialogue: 0,0:24:31.76,0:24:36.36,Default,,0000,0000,0000,,alles schon hoffentlich konfiguriert, ja,\Ndann sehe ich hier, das es ist ein Dialogue: 0,0:24:36.36,0:24:40.09,Default,,0000,0000,0000,,Ausschnitt aus dem Buffer, und zwar die\Nletzten, irgendwo in den letzten paar Dialogue: 0,0:24:40.09,0:24:45.25,Default,,0000,0000,0000,,hundert Bytes, da steht ziemlich\Nzufälliger Quatsch drin. Keine Ahnung, was Dialogue: 0,0:24:45.25,0:24:50.26,Default,,0000,0000,0000,,das ist das. Das hat irgend ein Prozess\Nvorher, oder vielleicht möglicherweise Dialogue: 0,0:24:50.26,0:24:56.17,Default,,0000,0000,0000,,auch der init Prozess, also das was vor\Nmeinem eigentlichen main Programm läuft, Dialogue: 0,0:24:56.17,0:25:02.93,Default,,0000,0000,0000,,da hingelegt, keine Ahnung, weiß ich\Nnicht. Und die return Adresse steht im Dialogue: 0,0:25:02.93,0:25:07.09,Default,,0000,0000,0000,,Moment noch auf dieser lustigen,\Nkryptischen Zahl. Das wird irgendwas sein, Dialogue: 0,0:25:07.09,0:25:11.70,Default,,0000,0000,0000,,was, nachdem main beendet wurde, also die\NFunktion main beendet wurde, Dialogue: 0,0:25:11.70,0:25:18.36,Default,,0000,0000,0000,,wahrscheinlich noch irgendwie Speicher\Naufräumt oder so etwas. So, jetzt sind wir Dialogue: 0,0:25:18.36,0:25:22.50,Default,,0000,0000,0000,,also an der Stelle stringcopy, also es ist\Nnoch nichts passiert. Wenn ich jetzt zum Dialogue: 0,0:25:22.50,0:25:31.46,Default,,0000,0000,0000,,nächsten breakpoint weiterlaufe, dann seht\Nihr? Hier oben sind ganz viele 0x90 Dialogue: 0,0:25:31.46,0:25:35.07,Default,,0000,0000,0000,,Instruktionen. Das sind die Anweisungen\Nfür den Prozessor: mach mal nichts, warte Dialogue: 0,0:25:35.07,0:25:39.93,Default,,0000,0000,0000,,mal einen Takt lang. Und davon habe ich\Nganz viele da rein geschrieben und Dialogue: 0,0:25:39.93,0:25:45.41,Default,,0000,0000,0000,,irgendwann kommt dann hier dieser Shell\NCode. Das war das Ding, was eben das Dialogue: 0,0:25:45.41,0:25:50.71,Default,,0000,0000,0000,,Programm beendet und die Shell startet.\NUnd ich kann auch schon sehen, die return Dialogue: 0,0:25:50.71,0:25:53.87,Default,,0000,0000,0000,,Adresse ist jetzt überschrieben worden mit\Neiner Adresse, die ich selber gewählt Dialogue: 0,0:25:53.87,0:25:59.21,Default,,0000,0000,0000,,habe. Und diese Adresse, die zielt\Nirgendwo oben vor den Shell Code in diese Dialogue: 0,0:25:59.21,0:26:04.77,Default,,0000,0000,0000,,ganzen no-operation Instruktionen, das\Nnennt man eine NOP-slide. Das macht man, Dialogue: 0,0:26:04.77,0:26:07.46,Default,,0000,0000,0000,,um ein bisschen zu puffern und ein\Nbisschen Platz zu haben und ein bisschen Dialogue: 0,0:26:07.46,0:26:10.78,Default,,0000,0000,0000,,Freiheit zu haben, weil wenn so ein\NProzess gestartet wird, dann hängen da Dialogue: 0,0:26:10.78,0:26:16.45,Default,,0000,0000,0000,,oben über dem Stack noch ganz viele andere\NSachen und die können sich, nicht zur Dialogue: 0,0:26:16.45,0:26:19.15,Default,,0000,0000,0000,,Laufzeit, die können sich aber auch von\NProgrammausführung zu Programmausführung Dialogue: 0,0:26:19.15,0:26:23.78,Default,,0000,0000,0000,,ändern. Wenn ich zum Beispiel eine neue\NVariable definiere oder whatever. Dialogue: 0,0:26:23.78,0:26:26.63,Default,,0000,0000,0000,,Jedenfalls habe ich die Sachen nicht immer\Nexakt an der gleichen Speicheradresse und Dialogue: 0,0:26:26.63,0:26:29.26,Default,,0000,0000,0000,,deswegen macht man gerne so einen NOP-\Nslide. Also man nimmt seinen Shell Code, Dialogue: 0,0:26:29.26,0:26:32.72,Default,,0000,0000,0000,,packt den irgendwo in die Mitte, packt\Ndavor ganz viele NOPs, wo der Rechner Dialogue: 0,0:26:32.72,0:26:35.39,Default,,0000,0000,0000,,einfach so durchtingelt und nichts tut,\Nund dann irgendwann an dem Shell Code Dialogue: 0,0:26:35.39,0:26:39.40,Default,,0000,0000,0000,,ankommt und dahinter packt man ganz viele\Nreturn Adressen, die oben in diese NOP- Dialogue: 0,0:26:39.40,0:26:44.85,Default,,0000,0000,0000,,Slide reinspringen. Das heißt, egal ob ich\Nden Bereich vor dem Shell Code treffe oder Dialogue: 0,0:26:44.85,0:26:47.87,Default,,0000,0000,0000,,den Bereich hinter dem Shell Code treffe,\Nes passiert immer was passieren muss, Dialogue: 0,0:26:47.87,0:26:52.11,Default,,0000,0000,0000,,nämlich er springt im ungünstigsten Fall\Nvon hinterm Shell Code zu vor dem Shell Dialogue: 0,0:26:52.11,0:26:55.96,Default,,0000,0000,0000,,Code und hangelt sich dann durch bis zum\NShell Code, der dann das tut, was er tut. Dialogue: 0,0:26:55.96,0:27:08.67,Default,,0000,0000,0000,,Und das ist der Buffer Overflow Exploit.\NDemo Time! Ja wobei, wie ich schon sagte, Dialogue: 0,0:27:08.67,0:27:12.62,Default,,0000,0000,0000,,das ist ein sehr akademisches Beispiel,\Nweil ich das alles halt sehr, um es Dialogue: 0,0:27:12.62,0:27:18.75,Default,,0000,0000,0000,,einfach zu halten, sehr klein gehalten\Nhabe. In der Realität würde man sagen, es Dialogue: 0,0:27:18.75,0:27:22.08,Default,,0000,0000,0000,,ist ja keiner so blöd, wenn da irgendwas\Nin den Puffer rein schreibt, nicht zu Dialogue: 0,0:27:22.08,0:27:25.05,Default,,0000,0000,0000,,checken, wie groß denn der Puffer ist und\Nmal zu gucken, ob man überhaupt noch da Dialogue: 0,0:27:25.05,0:27:33.64,Default,,0000,0000,0000,,rein schreiben darf. Das stimmt auch,\Nmeistens. {\i1}lacht{\i0} Das Problem ist: selbst, Dialogue: 0,0:27:33.64,0:27:38.34,Default,,0000,0000,0000,,wenn es immer gemacht würde, habe ich oft\Ndas Problem, dass ich das zu der Zeit, wo Dialogue: 0,0:27:38.34,0:27:40.93,Default,,0000,0000,0000,,ich das Programm schreibe, noch gar nicht\Nwissen kann, wie groß dieser Buffer sein Dialogue: 0,0:27:40.93,0:27:43.95,Default,,0000,0000,0000,,muss, weil ich es erst zur Laufzeit\Nmitbekomme, wie viele Pakete da jetzt Dialogue: 0,0:27:43.95,0:27:47.77,Default,,0000,0000,0000,,gleich ankommen, wenn es zum Beispiel ein\NNetzwerkdienst ist. Das heißt, die Größe Dialogue: 0,0:27:47.77,0:27:50.80,Default,,0000,0000,0000,,von so einem Buffer wird oft berechnet und\Nwenn ich jetzt bei der Berechnung der Dialogue: 0,0:27:50.80,0:27:53.88,Default,,0000,0000,0000,,Größe irgend einen Fehler habe, der dazu\Nführt, dass ich eine falsche Größe raus Dialogue: 0,0:27:53.88,0:27:58.14,Default,,0000,0000,0000,,bekomme, die dann dazu führt, dass der\NRechner, oder das Programm vielmehr, Dialogue: 0,0:27:58.14,0:28:03.26,Default,,0000,0000,0000,,denkt, der Buffer ist riesig groß, dann\Nschreibt das Ding halt weiter. Das ist Dialogue: 0,0:28:03.26,0:28:12.34,Default,,0000,0000,0000,,eine Sache, die oft ausgenutzt wird und\NDaten kommen halt eben, let's face it, Dialogue: 0,0:28:12.34,0:28:18.39,Default,,0000,0000,0000,,meistens nicht von der Kommandozeile, aber\Nstattdessen kommen die aus Dateien, die Dialogue: 0,0:28:18.39,0:28:22.54,Default,,0000,0000,0000,,ich irgendwie manipulieren kann oder sogar\Naus dem Netzwerk. Da habe ich natürlich Dialogue: 0,0:28:22.54,0:28:28.26,Default,,0000,0000,0000,,dann beliebige Angriffsvektoren. Das\Nheißt, was in der Realität passieren Dialogue: 0,0:28:28.26,0:28:32.91,Default,,0000,0000,0000,,würde, also jetzt beispielsweise bei\Ndiesen drei Dingern die wir da hatten: Das Dialogue: 0,0:28:32.91,0:28:40.12,Default,,0000,0000,0000,,Erste war ja der Firefox Browser. Da würde\Nman vermutlich ein Bild beispielsweise Dialogue: 0,0:28:40.12,0:28:45.14,Default,,0000,0000,0000,,sich zusammen bauen, was irgendwie den\NBild Standard nicht ganz erfüllt oder wo Dialogue: 0,0:28:45.14,0:28:52.88,Default,,0000,0000,0000,,irgendwo ein Byte falsch ist, so dass, wenn\Nder Browser das Bild lädt, sich irgendwo Dialogue: 0,0:28:52.88,0:28:57.22,Default,,0000,0000,0000,,verhaspelt und irgendwo es zu einem Buffer\NOverflow kommt, weil z. B. ein Puffer zu Dialogue: 0,0:28:57.22,0:29:02.65,Default,,0000,0000,0000,,klein ausgelegt wird. Oder ich kann\Nversuchen, es über Javascript Dinge zu Dialogue: 0,0:29:02.65,0:29:07.68,Default,,0000,0000,0000,,machen, aber das ist eigentlich noch was\Nanderes. Im zweiten Fall, von dem Adobe Dialogue: 0,0:29:07.68,0:29:12.66,Default,,0000,0000,0000,,Reader, sind es auch oft tatsächlich\Nirgendwelche Bilder. Das Problem bei dem Dialogue: 0,0:29:12.66,0:29:15.85,Default,,0000,0000,0000,,Adobe Reader ist halt so ein bisschen das\Nder so eine eierlegende Wollmilchsau ist. Dialogue: 0,0:29:15.85,0:29:22.14,Default,,0000,0000,0000,,Ich kann mit dem Teil ja beliebige\NBildformate anzeigen lassen, Text mit Dialogue: 0,0:29:22.14,0:29:25.51,Default,,0000,0000,0000,,eigenen Schriften, dass wäre auch ein\NAngriffsvektor, wenn ich da eine eigene Dialogue: 0,0:29:25.51,0:29:28.79,Default,,0000,0000,0000,,Schrift einbauen und die Schrift halt\Nirgendwie so baue, dass beim Einlesen und Dialogue: 0,0:29:28.79,0:29:33.97,Default,,0000,0000,0000,,beim Parsen und Bauen dieser Schrift der\NReader irgendwie einen Buffer Overflow Dialogue: 0,0:29:33.97,0:29:39.89,Default,,0000,0000,0000,,kriegt. Bis hin zu 3D Elemente, ich habe\Ngehört, sie haben teile von Flash in den Dialogue: 0,0:29:39.89,0:29:45.35,Default,,0000,0000,0000,,Adobe Reader eingebaut, damit man damit\Ndann 3D Modelle irgendwie anzeigen und Dialogue: 0,0:29:45.35,0:29:50.30,Default,,0000,0000,0000,,auch schön drehen kann. Was man ja alles\Nbraucht, alles im gleichen Programm, gute Dialogue: 0,0:29:50.30,0:29:55.31,Default,,0000,0000,0000,,Idee! Naja jedenfalls, auch da bieten sich\Nverschiedenste Angriffsvektoren und was Dialogue: 0,0:29:55.31,0:30:00.94,Default,,0000,0000,0000,,man machen würde ist halt eine Datei\Nbauen, die halten den Fehler ausnutzt und Dialogue: 0,0:30:00.94,0:30:07.51,Default,,0000,0000,0000,,einen Buffer Overflow erzeugt. Der Angriff\Nden ich hier gezeigt habe, der ist heute Dialogue: 0,0:30:07.51,0:30:11.92,Default,,0000,0000,0000,,aus verschiedenen Gründen nicht mehr\Nmöglich. Ich musste drei Dinge abschalten Dialogue: 0,0:30:11.92,0:30:16.22,Default,,0000,0000,0000,,um den überhaupt laufen lassen zu können.\NDas Eine ist, wie ihr euch wahrscheinlich Dialogue: 0,0:30:16.22,0:30:19.34,Default,,0000,0000,0000,,jetzt schon gedacht habt, naja dann könnte\Nich doch einfach sagen ich habe einen Dialogue: 0,0:30:19.34,0:30:22.88,Default,,0000,0000,0000,,bestimmten Programmspeicher, ich habe\Neinen bestimmten Datenspeicher und was im Dialogue: 0,0:30:22.88,0:30:26.48,Default,,0000,0000,0000,,Datenspeicher liegt, darf niemals nicht vom\NProzessor ausgeführt werden. Das gibt es. Dialogue: 0,0:30:26.48,0:30:31.78,Default,,0000,0000,0000,,Das nennt sich "write XOR execute" und ist\Nseit einigen Jahren im Kernel und sogar in Dialogue: 0,0:30:31.78,0:30:36.71,Default,,0000,0000,0000,,Hardware drin. Wenn es angeschaltet ist.\NDas musste ich ausschalten, dann gibt es Dialogue: 0,0:30:36.71,0:30:41.58,Default,,0000,0000,0000,,noch die Möglichkeit sogenannte Stack\NCanaries, also Kanarienvögel, in den Stack Dialogue: 0,0:30:41.58,0:30:46.92,Default,,0000,0000,0000,,einzubauen. Das ist so ein Magic Byte, was\Nda reingeschrieben wird, und ein bisschen Dialogue: 0,0:30:46.92,0:30:50.67,Default,,0000,0000,0000,,Code, was vor dem rückkehren der Funktion\Nnoch einmal testet, ob dieses Byte, was Dialogue: 0,0:30:50.67,0:30:57.10,Default,,0000,0000,0000,,ich da reingeschrieben habe, also zwischen\Nden lokalen Variablen und der Dialogue: 0,0:30:57.10,0:31:01.50,Default,,0000,0000,0000,,Returnadresse, moment ich mache das mal\Neben grafisch, damit man das sehen kann, Dialogue: 0,0:31:01.50,0:31:05.07,Default,,0000,0000,0000,,genau, also an diese Stelle, die jetzt da\Nschwarz markiert ist, zwischen dem Return Dialogue: 0,0:31:05.07,0:31:10.15,Default,,0000,0000,0000,,und dem Buffer, würde man ein zur Laufzeit\Ngewähltes beliebiges Byte reinschreiben Dialogue: 0,0:31:10.15,0:31:14.42,Default,,0000,0000,0000,,und bevor man aus der Funktion\Nzurückkehrt, würde man testen, ob dieses Dialogue: 0,0:31:14.42,0:31:18.69,Default,,0000,0000,0000,,Byte, was man da vorher reingeschrieben\Nhat, noch das gleiche ist wie vorher. Wenn Dialogue: 0,0:31:18.69,0:31:21.09,Default,,0000,0000,0000,,nicht, ist ein Buffer Overflow passiert\Nund dann lässt man das Programm besser Dialogue: 0,0:31:21.09,0:31:26.24,Default,,0000,0000,0000,,sofort abstürzen, anstatt abzuwarten, was\Njetzt kommt. Das ist ein Stack Canary. Dialogue: 0,0:31:26.24,0:31:33.04,Default,,0000,0000,0000,,Auch das musste ich ausschalten. Und das\NDritte ist bei modernen Betriebssystemen, Dialogue: 0,0:31:33.04,0:31:35.69,Default,,0000,0000,0000,,mittlerweile haben es glaube ich alle\Ndrin, ist das so, dass jeder Prozess mit Dialogue: 0,0:31:35.69,0:31:42.51,Default,,0000,0000,0000,,einem zufälligen Speicherlayout läuft. Das\Nheißt, ich kann nicht mehr wirklich sagen Dialogue: 0,0:31:42.51,0:31:46.36,Default,,0000,0000,0000,,wo meine Dinge im Speicher liegen und das\Nmacht es sehr sehr schwierig, weil ich ja Dialogue: 0,0:31:46.36,0:31:51.62,Default,,0000,0000,0000,,irgendwo an den Shell Code, an das Ende\Nvom Shell Code, eine Adresse schreiben Dialogue: 0,0:31:51.62,0:31:55.96,Default,,0000,0000,0000,,muss, die vorne in diese NOP slide\Nreinführt. Und wenn ich absolut keine Dialogue: 0,0:31:55.96,0:31:59.01,Default,,0000,0000,0000,,Ahnung habe, wo diese Adresse ist, also\Nich kann nicht mehr durch Vergrößern des Dialogue: 0,0:31:59.01,0:32:02.18,Default,,0000,0000,0000,,Buffers oder durch mehr NOPs einfügen kann\Nich das irgendwann nicht mehr schaffen, Dialogue: 0,0:32:02.18,0:32:06.33,Default,,0000,0000,0000,,weil es einfach so zufällig ist, dass ich\Nkeine Chance mehr habe herauszufinden, wo Dialogue: 0,0:32:06.33,0:32:10.89,Default,,0000,0000,0000,,zur Laufzeit denn dieser Shell Code liegt,\Nund wenn ich nicht weiß wo der liegt, kann Dialogue: 0,0:32:10.89,0:32:15.40,Default,,0000,0000,0000,,ich da nicht rein springen, kann ich also\Nkeinen Buffer Overflow Exploit machen. Dialogue: 0,0:32:15.40,0:32:19.08,Default,,0000,0000,0000,,Diese drei Dinge gibt es heute, die sind\Nin der Regel, also zwei davon macht der Dialogue: 0,0:32:19.08,0:32:23.05,Default,,0000,0000,0000,,Compiler, das Dritte macht das\NBetriebssystem, und die musste ich jetzt Dialogue: 0,0:32:23.05,0:32:27.37,Default,,0000,0000,0000,,alle umgehen, um das überhaupt\Ndemonstrieren zu können. Aber die zugrunde Dialogue: 0,0:32:27.37,0:32:32.05,Default,,0000,0000,0000,,liegenden Probleme bestehen weiterhin, die\Nsind nämlich: Speichermanagement ist Dialogue: 0,0:32:32.05,0:32:36.57,Default,,0000,0000,0000,,fehleranfällig, Menschen machen immer\NFehler, ist oft auch nicht so Dialogue: 0,0:32:36.57,0:32:41.15,Default,,0000,0000,0000,,übersichtlich, Datenformate sind zu\Nkomplex, Programme müssen zu viel Dialogue: 0,0:32:41.15,0:32:45.68,Default,,0000,0000,0000,,gleichzeitig können und das führt alles\Ndazu, dass halt immer mehr Fehler Dialogue: 0,0:32:45.68,0:32:48.65,Default,,0000,0000,0000,,passieren. Je höher die Komplexität ist,\Ndesto höher ist natürlich die Dialogue: 0,0:32:48.65,0:32:53.63,Default,,0000,0000,0000,,Wahrscheinlichkeit, das ich Fehler mache.\NUnd das ist nicht gefixt und die Dialogue: 0,0:32:53.63,0:32:58.46,Default,,0000,0000,0000,,Programmiersprachen, die man dafür\Nverwendet, sind eigentlich einer Zeit Dialogue: 0,0:32:58.46,0:33:03.64,Default,,0000,0000,0000,,entstammend, in der das Internet noch ein\Nfreundlicher Ort war. Man kannte sich und Dialogue: 0,0:33:03.64,0:33:09.10,Default,,0000,0000,0000,,da hat man über Security nicht so richtig\Nnachgedacht. Es gibt außerdem Nachfolger Dialogue: 0,0:33:09.10,0:33:13.42,Default,,0000,0000,0000,,von dieser Praxis, also diese Praxis, die\Nich jetzt hier gezeigt habe, geht halt Dialogue: 0,0:33:13.42,0:33:16.68,Default,,0000,0000,0000,,nicht, aber es gibt Nachfolger davon, also\NModifikationen davon, die sind ein Dialogue: 0,0:33:16.68,0:33:20.35,Default,,0000,0000,0000,,bisschen gewiefter, ein bisschen\Ntrickreicher und die schaffen es dann, Dialogue: 0,0:33:20.35,0:33:23.76,Default,,0000,0000,0000,,unter Umständen eben doch noch so etwas\Nnicht zu bekommen. Also das funktioniert Dialogue: 0,0:33:23.76,0:33:30.23,Default,,0000,0000,0000,,heute immer noch, wie ihr halt an den\NNachrichten gesehen habt. Oft werden auch Dialogue: 0,0:33:30.23,0:33:37.52,Default,,0000,0000,0000,,nicht alle Gegenmaßnahmen ergriffen, das\Nist halt Teil der Betriebssystemhersteller Dialogue: 0,0:33:37.52,0:33:43.80,Default,,0000,0000,0000,,bzw. Benutzer. An der Stelle danke ich und\NFragen? Dialogue: 0,0:33:43.80,0:33:53.26,Default,,0000,0000,0000,,{\i1}Applaus{\i0} Dialogue: 0,0:33:53.26,0:34:01.100,Default,,0000,0000,0000,,Herald: Herzlichen Dank haggl für diesen\Nwundervollen Vortrag! So, Frage-Antwort- Dialogue: 0,0:34:01.100,0:34:07.58,Default,,0000,0000,0000,,Runde, es gibt zwei Mikrofone, die sind\Ndort und dort, beleuchtet, wer eine Frage Dialogue: 0,0:34:07.58,0:34:15.35,Default,,0000,0000,0000,,hat, stellt sich bitte hinter die\NMikrofone und ich rufe dann auf. Keine Dialogue: 0,0:34:15.35,0:34:24.60,Default,,0000,0000,0000,,Fragen? Das scheint ein ganz schön\Numfangreicher Vortrag gewesen zu sein. Dialogue: 0,0:34:24.60,0:34:30.21,Default,,0000,0000,0000,,Haggl: Keine Fragen, oder seid ihr\Nbedient? Keine Fragen, weil es zu viele Dialogue: 0,0:34:30.21,0:34:38.11,Default,,0000,0000,0000,,gäbe, oder keine Fragen, weil es gar keine\Nmehr gibt? Achso, eine Entweder-Oder-Frage Dialogue: 0,0:34:38.11,0:34:41.80,Default,,0000,0000,0000,,kann man nicht mit Handzeichen\Nbeantworten, das ist schwierig. {\i1}lacht{\i0} Dialogue: 0,0:34:41.80,0:34:46.31,Default,,0000,0000,0000,,Herald: Dort steht jemand, bitte.\NFrage: Ich hätte mal eine Frage und zwar: Dialogue: 0,0:34:46.31,0:34:51.14,Default,,0000,0000,0000,,Ich habe die Stelle nicht gefunden, wo die\NReturn-Adresse ausgerechnet wird und Dialogue: 0,0:34:51.14,0:34:54.21,Default,,0000,0000,0000,,reingeschrieben wird, also der Return-\NWert. Dialogue: 0,0:34:54.21,0:34:57.37,Default,,0000,0000,0000,,Haggl: Ja, die konntest du auch nicht\Nfinden, weil ich die garnicht gezeigt Dialogue: 0,0:34:57.37,0:35:16.89,Default,,0000,0000,0000,,habe. Ich habe dazu noch ein kleines\NPythonskript, das das alles macht. Das ist Dialogue: 0,0:35:16.89,0:35:21.38,Default,,0000,0000,0000,,diese hier. Also der der Shellcode, den\Nich vorher gezeigt habe, das ist wirklich Dialogue: 0,0:35:21.38,0:35:28.57,Default,,0000,0000,0000,,nur der Part, der halt execve aufruft mit\N/bin/sh und der wird halt hier eingelesen Dialogue: 0,0:35:28.57,0:35:33.35,Default,,0000,0000,0000,,in diesem Pythonskript und dann baue ich\Nmit dem Pythonskript halt eben ganz viele Dialogue: 0,0:35:33.35,0:35:37.25,Default,,0000,0000,0000,,NOPs davor, das ist an der Stelle, also\Nhier berechne ich erstmal wie lange diese Dialogue: 0,0:35:37.25,0:35:41.25,Default,,0000,0000,0000,,NOP-slide sein soll und packe halt\Nden NOP-slide davor, dann kommt noch ein Dialogue: 0,0:35:41.25,0:35:45.01,Default,,0000,0000,0000,,bisschen Padding und Alignment, damit\Ndas alles richtig hinten rauskommt, dass Dialogue: 0,0:35:45.01,0:35:50.82,Default,,0000,0000,0000,,die Rücksprungadresse auch an der\Nrichtigen Stelle liegt im stack. Genau und Dialogue: 0,0:35:50.82,0:35:55.51,Default,,0000,0000,0000,,hier oben habe ich halt diese Target-\NAdresse und die kriegst du halt nur raus, Dialogue: 0,0:35:55.51,0:35:58.23,Default,,0000,0000,0000,,wenn du das Programm einmal laufen lässt\Nund mit dem Debugger schaust, na wo ist Dialogue: 0,0:35:58.23,0:36:02.18,Default,,0000,0000,0000,,denn der Buffer. Und dann kannst du halt\Nirgendwie eine Adresse in der Mitte von Dialogue: 0,0:36:02.18,0:36:07.85,Default,,0000,0000,0000,,dem Buffer aussuchen, den Shellcode\Ndahinter packen, ein par NOPs davor, dann Dialogue: 0,0:36:07.85,0:36:13.66,Default,,0000,0000,0000,,tut es das schon. So weit die Theorie, die\NPraxis, habe ich schmerzhaft gelernt, ist Dialogue: 0,0:36:13.66,0:36:18.73,Default,,0000,0000,0000,,ein bisschen komplizierter. Genau, also\Nmehr macht dieses Skript auch nicht, es Dialogue: 0,0:36:18.73,0:36:20.71,Default,,0000,0000,0000,,nimmt den Shellcode, packt NOPs davor,\Nreturn-Adresse dahinter, fertig. Dialogue: 0,0:36:20.71,0:36:26.46,Default,,0000,0000,0000,,Frage: Ist die Adresse eine relative oder\Neine absolute Adresse? Dialogue: 0,0:36:26.46,0:36:33.41,Default,,0000,0000,0000,,Haggl: Das ist eine absolute Adresse. Und\Ndas ist halt das Ding, an der Stelle Dialogue: 0,0:36:33.41,0:36:37.13,Default,,0000,0000,0000,,greift halt dieses address space layout\Nrandomization, also dieser Dialogue: 0,0:36:37.13,0:36:40.44,Default,,0000,0000,0000,,Abwehrmechanismus vom Betriebssystem, der\Ndafür sorgt, dass jedes mal, wenn ich das Dialogue: 0,0:36:40.44,0:36:45.47,Default,,0000,0000,0000,,Programm aufrufe, diese Adresse nicht mehr\Nstimmt. Das kann ich euch demonstrieren. Dialogue: 0,0:36:45.47,0:37:01.96,Default,,0000,0000,0000,,Wenn ich jetzt dieses Ding, was nämlich\Nder make Befehl macht, weil, wenn ich Dialogue: 0,0:37:01.96,0:37:06.28,Default,,0000,0000,0000,,dieses make exploit mache, was ich euch\Neben gezeigt habe, da wird vorher noch mit Dialogue: 0,0:37:06.28,0:37:11.52,Default,,0000,0000,0000,,diesem Befehl hier für den nächsten\NProzess, dieses address space layout Dialogue: 0,0:37:11.52,0:37:16.73,Default,,0000,0000,0000,,randomization ausgeschaltet. Standardmäßig\Nist das an im Linux Kernel und wenn ich Dialogue: 0,0:37:16.73,0:37:22.80,Default,,0000,0000,0000,,das nicht mache, sondern einfach nur das\NProgramm aufrufe und da meine payload Dialogue: 0,0:37:22.80,0:37:31.62,Default,,0000,0000,0000,,reinschiebe, dann gibt es zwar auch einen\Nsegmentation fault, natürlich, aber es Dialogue: 0,0:37:31.62,0:37:38.23,Default,,0000,0000,0000,,gibt halt, ich kriege halt keine shell.\NUnd das ist genau aus dem Grund, weil der Dialogue: 0,0:37:38.23,0:37:41.83,Default,,0000,0000,0000,,buffer nicht an der Stelle liegt, wo ich\Nihn vermutet habe und deswegen meine Dialogue: 0,0:37:41.83,0:37:46.31,Default,,0000,0000,0000,,Rücksprungadresse irgendwo im Speicher\Nzeigt, da springt er dann hin und, ups, Dialogue: 0,0:37:46.31,0:37:54.02,Default,,0000,0000,0000,,gibts einen segmentation fault. Die beiden\Nanderen Dinge könnte ich auch noch eben Dialogue: 0,0:37:54.02,0:37:58.55,Default,,0000,0000,0000,,zeigen, ich weiß nicht, wir haben noch\NZeit oder? Die beiden an Dinge könnte ich Dialogue: 0,0:37:58.55,0:38:02.82,Default,,0000,0000,0000,,eben auch noch zeigen, also was man machen\Nmuss, um die beiden anderen Dialogue: 0,0:38:02.82,0:38:06.94,Default,,0000,0000,0000,,Sicherheitsmechanismen abzuschalten. Da\Nmuss man das Programm nämlich mit diesen Dialogue: 0,0:38:06.94,0:38:17.76,Default,,0000,0000,0000,,beiden "-z execstack", das ist dieses was\Nden Softwarecheck ausschaltet, ob ich Dialogue: 0,0:38:17.76,0:38:23.11,Default,,0000,0000,0000,,gerade im stack versuche Programme, also\Ngenerell im Datenspeicher, nein im stack, Dialogue: 0,0:38:23.11,0:38:28.41,Default,,0000,0000,0000,,versuche, Programme auszuführen. Das muss\Nman ausschalten. Und dann gibt es noch Dialogue: 0,0:38:28.41,0:38:32.12,Default,,0000,0000,0000,,diesen stack protector, dass ist ein stack\Ncanarie, dass wird auch standardmäßig Dialogue: 0,0:38:32.12,0:38:37.59,Default,,0000,0000,0000,,eingebaut. Muss man also auch explizit\Nausschalten, um das möglich zu machen. Das Dialogue: 0,0:38:37.59,0:38:41.34,Default,,0000,0000,0000,,heißt , Programme, die mit modernen\Ncompilern und modernen compiler flags Dialogue: 0,0:38:41.34,0:38:45.73,Default,,0000,0000,0000,,kompiliert wurden, sollten trade mark\Neigentlich nicht so leicht verwundbar Dialogue: 0,0:38:45.73,0:38:50.45,Default,,0000,0000,0000,,sein. Und wenn dann noch address space\Nlayout randomization dazu kommt, dann ist Dialogue: 0,0:38:50.45,0:38:54.80,Default,,0000,0000,0000,,das schon relativ gut, da muss man schon\Necht eine Menge Zeug machen, um dann noch Dialogue: 0,0:38:54.80,0:39:01.71,Default,,0000,0000,0000,,irgendwie reinzukommen. Aber es geht halt\Ntrotzdem. Dialogue: 0,0:39:01.71,0:39:05.75,Default,,0000,0000,0000,,Herald: Gut ich sehe da drüben an dem\NMikrofon noch jemanden, der wartet, bitte. Dialogue: 0,0:39:05.75,0:39:11.96,Default,,0000,0000,0000,,Frage: Kann man nicht einfach relative\NAdressen verwenden, um ASLR auszuhebeln Dialogue: 0,0:39:11.96,0:39:17.49,Default,,0000,0000,0000,,und wenn nein, warum nicht?\NHaggl: Was meinst du mit relativ, relativ Dialogue: 0,0:39:17.49,0:39:23.41,Default,,0000,0000,0000,,wozu?\NFrage: Naja, also ich meine, ah nein, ich Dialogue: 0,0:39:23.41,0:39:30.43,Default,,0000,0000,0000,,habe es gerafft, okay.\NHaggl: Aber im Prinzip bist du auf dem Dialogue: 0,0:39:30.43,0:39:35.84,Default,,0000,0000,0000,,richtigen Weg, also was man halt machen\Nkann, ist, man kann herausfinden, wo die Dialogue: 0,0:39:35.84,0:39:40.94,Default,,0000,0000,0000,,libc zum Beispiel anfängt. Und wenn ich\Nweiß, wo die libc anfängt, dann weiß ich Dialogue: 0,0:39:40.94,0:39:45.44,Default,,0000,0000,0000,,auch, wenn ich zudem noch die Version von\Nder libc kenne, die da reingelinkt wurde, Dialogue: 0,0:39:45.44,0:39:50.42,Default,,0000,0000,0000,,weiß ich dann auch, wo bestimmte Dinge aus\Nder libc im Speicher liegen. Und sobald Dialogue: 0,0:39:50.42,0:39:55.37,Default,,0000,0000,0000,,ich das habe, kann ich halt dann anfangen,\Nmir wieder Dinge zusammenzubauen. Das geht Dialogue: 0,0:39:55.37,0:39:57.29,Default,,0000,0000,0000,,aber dann eher in Richtung return oriented\Nprogramming. Dialogue: 0,0:39:57.29,0:40:06.68,Default,,0000,0000,0000,,Herald: Gut, sieht aus, als sei die Frage\Nbeantwortet, gibt es noch weitere Fragen? Dialogue: 0,0:40:06.68,0:40:10.53,Default,,0000,0000,0000,,Das scheint nicht der Fall zu sein, aus\Ndem Internet scheint auch keine Frage zu Dialogue: 0,0:40:10.53,0:40:21.48,Default,,0000,0000,0000,,kommen. Dann würde ich hiermit den Vortrag\Nschließen, herzlichen Dank haggl! Dialogue: 0,0:40:21.48,0:40:27.38,Default,,0000,0000,0000,,{\i1}Applaus{\i0} Dialogue: 0,0:40:27.38,0:40:33.28,Default,,0000,0000,0000,,{\i1}35c3 Abspannmusik{\i0} Dialogue: 0,0:40:33.28,0:40:47.00,Default,,0000,0000,0000,,Untertitel erstellt von c3subtitles.de\Nim Jahr 2020. Mach mit und hilf uns!