Wie wichtig ist Assembler?

Hallo Community :)

ich habe mich schon länger nicht mehr an euch gewandt aber jetzt wird es mal wieder Zeit - den Zeit ist kostbar und ich hoffe mit eurer fachkundigen Meinung davon einige einsparen zu können :thumb_up:

Worum es geht:

Ich bin seit einigen Jahren Programmierer - "Web-Programmierer", sprich ich beherrsche eigentlich alles vom HTML, über JS & diversen Frameworks, bis hin zu PHP (OOP). Jetzt, nach Jahren komme ich mal wieder darauf zurück, mich fürs hacking zu interessieren und wollte, nun etwas älter und reifer ;) einfach mal ne Schippe drauf legen. Das heißt bei mir, ich möchte geplant und gezielt vorgehen, Lerneinheiten mit Erfolgseinheiten und Spaß belohnen und in möglichst kurzer Zeit so den bestmöglichsten Lerneffekt erzielen.

Nun stellt sich mir die Frage, wo ich anfangen sollte bei der "Desktop"-Programmierung.
Ich erinnere mich an Turbo Assembler inb der Berufsschule wo wir Grafikkarten programmierten, über Speicher sprachen und ich erinnere mich an nicht viel mehr als die letzten 20 Worte davon.
Dennoch, halte ich es für sehr wichtig - was ist man für ein hacker, wenn man nicht einmal in der Theorie genau weiß, was ein Bufferoverflow ist, geschweigeden wie und wann er passiert, so meine aktuelle Denkweise.

Nun die Frage an euch - ist es noch wichtig / macht es Sinn dort anzusetzen oder sollte ich mich eher mit C, C++ oder Java beschäftigen?
Wenn ihr Hacker klassifizieren müsstet anhand ihres Skillsets, würdet ihr sagen, es kann "Stufe 3 Hacker" (1-6 Notensystem) geben, die ohne Assembler auskommen, muss ich C lernen oder sollte ich gleich auf C++ gehen? Und wäre es unprofessionell nur Java zu lernen, statt eine der C-Sprachen? Ich glaube, ihr merkt langsam worauf ich hinaus will oder?

Was begegnet euch so im Alltag, was könnt ihr? Lernt man genug über Speicherbelegung, Funktionsweisen etc. wenn man gleich mit einer Hochsprache wie C++ anfängt oder ist es besser "back to the roots" zu gehen um "Nichts" zu verpassen?

Wie gesagt, ich bin ein normaler Mensch,der leider auch noch recht wenig Zeit mitbringt ( 1-2 Std am Tag vll.) und möchte einen guten Mittelweg zwischen Professionalität & Spaß durch "Erfolg" <- (heißt, einsetzbar in heutigen standard-hacking Prozederes) finden.

Wenn einer seine Erfahrung und Tipps mit mir teilen würde, würde ich mich sehr freuen :)

Vielen Dank und einen schönen Abend euch noch.

PHP
 
Auch ohne Assembler-Kenntnisse kann man sich mit Dingen wie Organisation des Speichers auf System- und Programmebene beschäftigen. Tatsache ist, dass man für kaum ein Exploit heutzutage noch Assembler-Kenntnisse braucht. Assembler kommt da zumeist nur noch in Form von Shellcodes vor. Will man da keine fertigen nutzen, muss man sich allerdings auch nur grundlegend mit Assembler auseinandersetzen. Wie wenig das tatsächlich ist, kannst du z.B. in Shellcode (Exploit) nachlesen.

Wesentlich mehr Sinn macht es eine Sprache zu lernen, wo man möglichst viel selbst steuern kann/muss. C war mein Mittel der Wahl, weil bis heute die meisten Betriebssysteme in C geschrieben sind und der Schritt zu C++ dann nicht mehr weit ist. Schliesslich setzt C++ lediglich die Objektorientierung auf C drauf (zumindest ganz grob gesehen). Durch C lernt man Dinge wie den Umgang mit Pointern und das manuelle allozieren von Speicher, wodurch man auch gleich die Gefahren darin besser verstehen kann.

Ansonsten reichen aber für die meisten Dinge auch Skriptsprachen wie Python, Perl oder Ruby. Schau dir z.B. Metasploit an. Dort wirst du in kaum einem Exploit Assembler-Code finden. Wenn deine Zeit eh knapp ist, solltest du dich sowieso eher mit solchen Exploit-Frameworks beschäftigen, da sie einem viel Arbeit ersparen können. Und dafür sind Sprachen wie Python wesentlich wichtiger als Assembler.

Java allerdings ist für Exploits eher ungeeignet. Das liegt vor allem an den Einschränkungen, die eine JVM mit sich bringt. Wie der Name "Java Virtual Machine" schon andeutet, laufen Java-Prozesse in gekapselten Speicherbereichen. Sie können also kaum Einfluss auf andere Programme nehmen. Hinzu kommt, dass Dinge wie SetUID-Calls in Java nicht mal eben so funktionieren. Da müsstest du dann Aufrufe an C-Libraries machen oder ähnliches um ein SetUID-Programm umzusetzen. Java ist daher in der Webentwicklung (Servlets) und bei GUI-losen Anwendungen (Server, Cluster-Manager etc.) ganz nützlich, aber nicht zum Schreiben von Exploits.

Zu deiner Frage, ob es einen Note-3-Hacker gibt: Zuerstmal solltest du dir klar darüber werden, dass nicht jeder Hacker im Sicherheitsbereich unterwegs ist. Es gibt auch Hacker, die sehr komplexe Tools wie Satelliten-Steuerungen oder Statistik-Analyzer schreiben. Wieder andere löten aus ein paar Chips und Leiterplatten Dinge zusammen, bei dem einem das "Wow!" vor Staunen im Hals stecken bleibt. Und wieder andere schreiben halt Compiler oder arbeiten an einem Betriebssystem, wozu tatsächlich Assembler-Kenntnisse notwendig sind. Und dann gibt es noch Hacker, die in gänzlich anderen Bereichen aktiv sind. Gute Beispiel dafür sind Bio-Hacker, Social Engineers oder Physik/Mathe-Nerds. Man kann also auch ein Hacker sein ohne eine einzige Zeile Assembler schreiben zu können. (Technisches) Hacken ist in erster Linie eine Lebenseinstellung, die beinhaltet, dass man sich den vorgegebenen Grenzen der Technik nicht beugt. Wenn ein Programm mir bestimmte Rechte im System nicht einräumt, obwohl es selbst über diese verfügt, dann versuche ich halt eine Möglichkeit zu finden trotzdem an die Rechte zu kommen. Wenn ein Server mir einen offenen Port anbietet, auf dem ein mir unbekanntes Protokoll verwendet wird, dann versuche ich die Details dieses Protokolls herauszufinden. Das macht (technisches) Hacken aus. Ob man dazu Assembler braucht, ist dann absolut situationsabhängig. Natürlich wirst du nie einen Bootloader programmieren können, wenn du kein Assembler kannst. Aber willst du das überhaupt? Du wirst auch keinen Shellcode erstellen können ohne grundlegend Assembler zu verstehen. Aber brauchst du das überhaupt? Sicher ist nur, dass Hacker eines gemeinsam haben: Ihnen reicht die Note 3 nicht. Sie versuchen immer die Besten auf ihrem Gebiet zu werden und sind mit Leidenschaft dabei.

Um die Frage, ob du Assembler lernen solltest, zu beantworten, musst du also selbst erstmal entscheiden, was du überhaupt willst. Zum durchschnittlichen Exploiten von Anwendungen brauchst du kein Assembler. Nimm dir das Metasploit-Framework und du hast alles, was du dafür brauchst. Um aber selbst kleine Betriebssysteme oder Steuerungseinheiten zu programmieren, ist Assembler notwendig. Meine Empfehlung daher: Lerne Assembler, wenn die Notwendigkeit dafür besteht und du es akut brauchst. Sonst wende dich lieber einer "einfachen" Hochsprache wie C zu, die dir ausreichend Wissen in die Funktionsweise von Betriebssystemen vermittelt.
 
Hey Bitmuncher,

vielen Dank für Deine nützliche Antwort.
Ich hatte 2 Tage während des Frage-stellens und heute wo ich die Antwort gelesen habe und muss gestehen, es ist schon ein Lernpaket zur Microcontroller-Programmierung ( Lernpaket Mikrocontroller programmieren: Amazon.de: Burkhard Kainka: Bücher ) von Amazon auf dem Weg zu mir nach Hause.

Ich kann einfach kein Haus bauen und meine Familie darin unterbringen, wenn ich nicht den Grund, das Fundament und die Statik selbst überprüft habe, metaphorisch gesprochen.

Ich könnte niemals ein Gefühl der Sicherheit entwickeln, wenn ich mit einem System arbeite, welches ich mir nicht selbst geschrieben habe und alles, jeden Eingang, jeden Ausgang überwacht und kontrolliert, so mein Fazit nach 2 Tagen der Überlegung. Der Link zur Shellcode-Programmierung bestätigt hierbei auch nochmal meine Entscheidung.
Außerdem interessiert es mich, ich möchte wissen was passiert, vom Programmcode bis zum Relais.

Zumindest, rudimentär, da ich nicht alles wissen kann - und will, hier liegt der Unterschied zwischen Intelligenz und Belesenheit, den ich nicht müde werde zu erwähnen hehe - daher werde ich Deinen Ratschlag nun insofern beherzigen, als dass ich meine Lerneinheiten, bzw. deren Intensität aufteile nach Grundwissen erlangen, Praxiserfahrung sammeln, und Detail-Wissen aneignen.

Sprich, wenn ich mein Amazon-Set erst einmal verbastelt habe, und mich etwa 2 Wochen (3 Mann Tage a 8 Std. so) mit Assembler beschäftigt habe, werde ich direkt übergehen zu C++ - zumindest, Deiner nächsten Antwort abhängig, mein Plan, denn wie ich Dich richtig verstanden habe ist C nicht Objekt-orientiert also C++ die objektorientierte Variante? Dann sehe ich kein Grund C zu lernen, sondern gleich C++ - Was Du mir vielleicht auch noch sagen könntest, wie es bei C++ mit Wissen und Kenntnissen auf Hardwareebene aussieht, also über Speicherbelegung Hardware etc., ein Beispiel aus dem Assembler Tut was bei mir gerade parallel geöffnet ist:

Klasse Kürzel Bedeutung weitere Hinweise Allgemeine Register AX Akkumulator Teilung in hohes Byte (AH) und niedriges Byte (AL)
BX Basis-Register Teilung in hohes Byte (BH) und niedriges Byte (BL)
CX Count-Register Teilung in hohes Byte (CH) und niedriges Byte (CL)
DX Daten-Register Teilung in hohes Byte (DH) und niedriges Byte (DL) Pointer-Register SP Stack-Pointer zur Adressierung des Stacks verwendet
BP Base-Pointer zur Adressierung des Stacks verwendet
IP Instruction-Pointer Offset des nächsten Befehls Index-Register SI Source-Index Unterstützung von Adressierungen
DI Destination-Index Unterstützung von Adressierungen Segment-Register CS Code-Segment zeigt auf aktuelles Codesegment
DS Daten-Segment zeigt auf aktuelles Datensegment
SS Stack-Segment zeigt auf aktuelles Stapelsegment
ES Extra-Segment zeigt auf weiteres Datensegment


Soetwas meine ich.
Ich bin primär daran interessiert mir Wissen anzueignen, was mich zu Spaß-Hacking führt.

Fremde Exploits benutzen, Pages defacen, Menschen ausspionieren, sowas interessiert mich alles nicht. Dafür kenne ich mich zu gut und will viele Dinge gar nicht wissen ;) Was mich aber begeistern würde, alles zu können - mit meinem gerooteten Handy Zigaretten Automaten umzuprogrammieren, Autos zu öffnen - und das darf soweit gehen, das ich mir eine eigene Netzwerkkarte zusammen bastel, die IPs spoofen kann.

Wie Du bemerkst kllingt das recht diffus, aber meine Vorkenntnisse und eine hohe Auffassungsgabe werden mir kombiniert mit einem gezielten Vorgehen und noch einigen Tipps das ermöglichen. Hoffe ich soweit.

Also, Danke für die Tipps bisher, vielleicht bist Du ja so frei und antwortest mir noch auf meine 2 Fragen weiter oben im Text :)

Vielen Dank.

PHP
 
vielen Dank für Deine nützliche Antwort.
Ich hatte 2 Tage während des Frage-stellens und heute wo ich die Antwort gelesen habe und muss gestehen, es ist schon ein Lernpaket zur Microcontroller-Programmierung ( Lernpaket Mikrocontroller programmieren: Amazon.de: Burkhard Kainka: Bücher ) von Amazon auf dem Weg zu mir nach Hause.
Hättest das Geld mal besser in einen Raspberry Pi investiert und dir mit Hilfe von https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/ dein eigenes System dafür geschrieben. Ich befürchte nämlich, dass du zu viel auf ein Mal willst. Microcontroller zu programmieren ist etwas anderes als auf x86-Hardware zu programmieren.

Ich kann einfach kein Haus bauen und meine Familie darin unterbringen, wenn ich nicht den Grund, das Fundament und die Statik selbst überprüft habe, metaphorisch gesprochen.
Diese Eigenschaft solltest du ablegen. Wie du ja schon bemerkt hast, kannst du nicht alles können. Von daher ist es nützlich sich das Wissen anderer zunutze zu machen. Um beim Beispiel des Hauses zu bleiben: Ein Statiker wird wesentlich eher das Fundament einschätzen können als du. ;)

Ich könnte niemals ein Gefühl der Sicherheit entwickeln, wenn ich mit einem System arbeite, welches ich mir nicht selbst geschrieben habe und alles, jeden Eingang, jeden Ausgang überwacht und kontrolliert, so mein Fazit nach 2 Tagen der Überlegung. Der Link zur Shellcode-Programmierung bestätigt hierbei auch nochmal meine Entscheidung.
Außerdem interessiert es mich, ich möchte wissen was passiert, vom Programmcode bis zum Relais.
Und dennoch wirst du vermutlich nie ernsthaft mit einem System arbeiten, das du selbst geschrieben hast. Ausnahme wäre da höchstens der oben erwähnte RPi, weil der im Umgang mit der Hardware wesentlich einfacher zu handhaben ist als eine normale PC-Architektur.

Sprich, wenn ich mein Amazon-Set erst einmal verbastelt habe, und mich etwa 2 Wochen (3 Mann Tage a 8 Std. so) mit Assembler beschäftigt habe, werde ich direkt übergehen zu C++ - zumindest, Deiner nächsten Antwort abhängig, mein Plan, denn wie ich Dich richtig verstanden habe ist C nicht Objekt-orientiert also C++ die objektorientierte Variante? Dann sehe ich kein Grund C zu lernen, sondern gleich C++ - Was Du mir vielleicht auch noch sagen könntest, wie es bei C++ mit Wissen und Kenntnissen auf Hardwareebene aussieht, also über Speicherbelegung Hardware etc.,
Du wirst bei C jedenfalls nicht wissen müssen in welchen CPU-Registern deine Daten landen. Wie der Speicher organisiert ist, wirst du aber lernen. Und was darüber hinaus geht, kannst du ja trotzdem lernen um die Hintergründe der Sprache besser zu verstehen. Niemand muss Assembler lernen um zu verstehen wie Hardware funktioniert. Und Hochsprachen wie C/C++ haben den Vorteil, dass sie dir sehr viel Getippe sparen. Falls es dann doch mal sein muss, bieten sie dir die Möglichkeit von Inline-Assembler, so dass du bei Bedarf auch direkt auf die Hardware gehen kannst.

Im übrigen gibt es sehr wohl einen guten Grund C zu lernen und nicht nur C++. C ist wesentlich performanter, da es den ganzen Objektorientierungsballast nicht rumschleppt, der nur RAM verstopft. Gerade bei der Programmierung auf Betriebsystemebene ist das ein unschlagbarer Vorteil.


Was mich aber begeistern würde, alles zu können - mit meinem gerooteten Handy Zigaretten Automaten umzuprogrammieren, Autos zu öffnen - und das darf soweit gehen, das ich mir eine eigene Netzwerkkarte zusammen bastel, die IPs spoofen kann.
Scheinbar stammen deine Vorstellungen von Hacking aus Filmen. Du wirst ganz sicher keine Zigarettenautomaten "in the wild" umprogrammieren, weil sie dir dafür gar keine Schnittstelle bieten. Auch musst du keine Netzwerkkarten zusammenlöten um IP-Spoofing zu machen.

Wie Du bemerkst kllingt das recht diffus, aber meine Vorkenntnisse und eine hohe Auffassungsgabe werden mir kombiniert mit einem gezielten Vorgehen und noch einigen Tipps das ermöglichen. Hoffe ich soweit.

Ja, das klingt sehr diffus, denn deine Vorstellungen sind fernab der Realität. Und auch du wirst die Erfahrung machen, dass du dich irgendwann spezialisieren musst, wenn du in irgendwas richtig gut werden und nicht nur "ein bisschen Ahnung von allem" haben willst.
 
Bitmunchers Antworten sind beide sehr gut. Nur ich denke, C zu lernen hat mehr Sinn als nur Performance. Gerade zwischen C und C++ sollte nicht dermaßen ein Performance-Unterschied bemerkbar sein (auf PC zumindest).

C++ ist einfach sehr sehr ... sehr viel umfangreicher als C (als Sprache). Somit kann man C viel schneller lernen und "komplett verstehen".

Außerdem ist die Programmiererfahrung meiner Meinung nach eine völlig andere. In C muss ich viel mehr selber machen (es gibt keine vordefinierten Datentypen wie list oder vector in C++) und ich habe nicht so viele Möglichkeiten wie in C++ (ergo auch weniger Möglichkeiten, etwas falsch zu machen). C ist etwas weniger "mächtig" (trotzdem kannst du mit beiden Sprachen dieselben Probleme lösen).

C++ wird auch kontinuierlich weiterentwickelt, da gab es in den letzten Jahren große Veränderungen/Umwälzungen. In C gab es auch Veränderungen, aber ich denke seit C99 nichts signifikantes mehr. Und wenn du dir C++ anschaust, würde ich auf jeden Fall empfehlen, Quellen zu suchen, die zumindest C++11 Code verwenden (alles davor war nur C mit Klassen im Prinzip).
 
C/C++ und Assembler sind sowas von 1990-2000. Die kleine Welt des eigenen PCs, der über ein 56k Model Kontakt zur Außenwelt aufbaut, und auf dem alle Daten eines Menschen gespeichert sind gibt es nicht mehr. In Zeiten der Cloud und dem Internet of Things interessiert sich in der Tat kaum jemand für die wenigen Daten, die noch lokal gespeichert sind (mal abgesehen von Kryptokeys, ...). In den Netzwerken liegen die waren Schätze, die es als Angreifer auszugraben gilt. Dafür nehme ich aber weniger C/C++ und schon garnicht Assembler. Dafür gibt es Skript- und Bytecodesprachen, die nicht nur auf vielen Systemen ausführbar sind, sondern einen deutlich einfacheren Einstieg in die Materie bieten können. So kann ich mir die Fehler in der WebPKI mit Java und Python deutlich schneller klar machen, als mit den rudimentären Netzwerkfunktionen von C. Eine Man-in-the-Middle-Attacke ist mit wenigen Zeilen Code implementiert, ein Scanner hat nicht mehr. Die meisten Frameworks bieten Schnittstellen zu Hochsprachen, womit sich schon mächtige Angriffe fahren lassen.

Dir geht es um den Spaß. Aus eigener Erfahrung kann ich dir sagen, dass weder C, noch C++ wirklich Spaß machen. Und Assembler schon mal garnicht, wenn man sich nicht gerade für Microcontroller interessiert, für die man aber heute dank Arduino und Co. auch kaum noch ausgereifte Programmierkenntnisse braucht. Skriptsprachen machen dagegen Spaß, denn sie ermöglichen schnelle Erfolge selbst bei geringem Wissen. Von der Mächtigkeit stehen sie auch den alten Sprachen in keinem nach.

Fakt ist jedenfalls: Heute lernst du nichtmal mehr im Studium, wie ein moderner Computer funktioniert - es ist einfach viel zu kompliziert. Informatik ist ein extrem großes Gebiet geworden, das du nie komplett durchdringen wirst, wenn du dich nicht Tag und Nacht damit beschäftigst. Fakt ist aber auch: Die Zeit des klassischen PC ist vorbei. Die Cloud wird jeden Tag mächtiger, bietet schier unendliche Ressourcen. Spiele werden gestreamt, Videos und Telefongespräche ebenfalls. Daten werden auf Netzwerkspeichern gespeichert, ohne Internet sind viele PCs praktisch nutzlos. Und dann gibt es da noch Tablets, Chromebooks, Android-Smartphones, die iCloud, Office 365, usw.. Das wird viele neue Probleme bringen, die WebPKI ist das beste Beispiel. Die sichere Authentifizierung ist ein anderes. Die Ausnutzung und Lösung dieser Probleme wird interessant - Buffer Overflows und Co. werden dagegen in Zeiten von widerstandsfähigen VMs, diverser ausgereifter Speicherschutzmechanismen, usw.. nahezu aussterben.
 
Zuletzt bearbeitet:
C/C++ und Assembler sind sowas von 1990-2000.

aha, passt leider nicht mit deiner Aussage über Cloud zusammen. Nehmen wir Xen als Virtualisierung für Cloudsysteme her. Darauf basierend hat Amazon ihre Cloud aufbaut - natürlich gibt es auch weitere Varianten und Versionen, aber ein Gegenbeispiel sollte reichen. Xen basiert auf C und im Speziellem auf Assembler. So werden hier direkt in Registern die Variablen zwischen Host und Guest ausgetauscht.

Sagen wir jetzt mal, wir haben Zugriff auf ein Guest-System. Wie kommen wir nun auf das Host-System? Über in C implementierte Hypercalls. Man sollte als "Hacker" (wohl eher Cracker, was auch deinem Aussagen eher entspricht) möglichst sich in diesen Bereichen auskennen, zumindest den Code mehr oder weniger flüssig lesen können.

Auch wenn man sich praxisbezogen in einen Kernel einlesen will, dann wird man um C nicht herumkommen. Was ich hier wirklich nur betonen kann ist C, nicht C++. Auch sollte bei C sehr aufgepasst werden, da sich Bibliotheken und Schreibstil zwischen Userland und Kernelspace sehr unterscheiden. Falls der Beitragssteller sich darin einlesen will (und eventuell auch mal etwas schreiben), dann ist die Denkweise in OOP eher hinderlich.

Buffer Overflows und Co. werden dagegen in Zeiten von widerstandsfähigen VMs...

Bleiben wir bei Xen. Vor einigen Versionen waren hier noch Bufferoverflows innerhalb der Hypercalls eine Sicherheitslücke. Welche Sicherheitslücken momentan noch existieren ist natürlicherweise nicht wirklich klar.

Ich gebe dir recht, dass vieles auf Rechnerzentren, bzw. Clouds ausgelagert wird. Warum aber dahingehend ein Linux-Kernel nicht mehr interessant ist, erschließt sich mir nicht. Auch Windows oder Mac setzen bei ihren Server-Lösungen keine rudimentär anderen Systeme ein, als auf den jeweiligen Standart-PCs.

Ich bin mir nicht sicher, worauf du mit "ausgereiften Speicherschutzmechanismen" anspielen willst, jedoch werden bei Access Control Systeme innerhalb von Host IDSs immer noch die zu komplexen Policies beklagt, wodurch auch immer wieder Fehler entstehen (z.B. SELinux als Basis). Auch Network-IDS befindet sich weiter in Testphasen und schalten meistens nach einem Angriff, anstatt ihn zu vermeiden. Zusätzlich wird das Thema noch durch SDNs angetrieben und auf neuen Pfaden geworfen.

Heute lernst du nichtmal mehr im Studium, wie ein moderner Computer funktioniert - es ist einfach viel zu kompliziert.

Das finde ich persönlich auch wirklich schade. Vieles wird nur noch Konzepte und Abstraktionen beigebracht, was jedoch im Code dahintersteht, ist meist um ein Vielfältiges komplexer. Aber wir haben hier ja keinen Studenten sondern einen zukünftigen Hacker - darf für einen Hacker ein System zu kompliziert sein? :P

In diesem Sinne,

Scutus
 
aha, passt leider nicht mit deiner Aussage über Cloud zusammen.
Meine Aussage passt aus deiner Sicht auch nicht mit dem Internet of Things zusammen. Grenzen wir IoT z.B. auf Industrie 4.0 ein, so bleiben neben SPS fast ausschliesslich C und Assembler als Sprachen übrig. Darum ging es mir aber nicht. Der Punkt ist, dass ich kein C können muss, um ein Industrienetz zu stören. Ich muss nur wissen, dass die meisten Industrienetze extrem sensibel auf Latenzschwankungen reagieren. Ich muss nur wissen, dass ich mit einem simplen SYN-Scan ein gesamtes Netzwerk lahm legen kann. Und das geht in 2-3 Zeilen Python Code deutlich effizienter, als mit 50-100 Zeilen Code, weil ich mich noch um Buffer, usw.. kümmern muss.

Mein Punkt ist, dass die Angriffe, für die man Sprachen wie C oder Assembler einsetzen muss, derart komplex sind, dass "Späteinsteiger" oder Hobby-Informatiker in der Regel scheitern werden. Früher, als IT noch "einfach" war, ging das noch. Das Internet basierte auf uralten Versionen von HTTP und TCP, in denen Sicherheit einfach kein Thema war, weil man nie mit einem solchen Wachstum gerechnet hat. Computer hatten damals noch keine dedizierten Sicherheitsmechanismen und wenn, dann waren sie leicht überwindbar. Im Notfall hat man den Rechner einfach per ICMP-Paket überlastet. Man brauchte nicht viel, um solche Angriffe zu fahren. Heute ist das anders. Heute hast du Ghost Stacks und Compiler, die eigene Schutzmechanismen implementieren. Du hast Compiler, die gleichzeitig Fuzzer mitbringen und die dich bei der Nutzung von gefährlichen Funktionen warnen. Ja, du hast sichere Funktionen, die du nutzen kannst. Es ist schön, dass man heute noch grundlegendes Wissen über Buffer Overflows aufbaut - diese Wissen bringt nur nichts, da die meisten Angriffe auf modernen Rechnersystemen versagen. In allen Uni-Veranstaltungen, die ich dazu besucht hatte, war die erste Aufgabe, die Stack-Randomisierung abzuschalten. Warum? Weil Angriffe auf die Randomisierung zu aufwändig waren. Ok, später kam dann ROP. Aber selbst dagegen gibt es inzwischen nicht gerade wenige Abwehrmechanismen.

Dazu kommt, dass alleine die Entwicklung eines Verständnisses bzgl. dieser Methoden einiges an Zeit und Aufwand erfordert. Ich wage zu bezweifeln, dass man mit einigen Stunden nach Feierabend in der Lage sein wird, Angriffe gegen die ARM TrustZone oder die Mechanismen in TPM 2.0 zu entwickeln. Und wenn, dann wird das mit viel Blut, Schweiss und Tränen verbunden sein - wer das nicht durchziehen muss, der wird schnell die Motivation verlieren. Dazu kommt, dass es inzwischen sehr viele Menschen gibt, die Sicherheitsmechanismen hierfür entwickeln und die sehr viel mehr Erfahrung aufweisen, als man selbst. Man ist nicht mehr alleine auf weiter Flur, wie das noch Anfang der 90er der Fall war.

Deswegen bleibe ich bei meiner Aussage: C ist heutzutage für Hobbyentwickler, die nichts mit Microcontrollern machen, ungeeignet. Wie oben ausführlich ausgeführt, sind Netzwerke sind die großen Gebilde der Zukunft, die derzeit vor Unsicherheiten, Bugs oder Datenschutzverstößen nur so strotzen. Das Internet ist eines der unsichersten Gebilde, voll mit temporären Fixes und unsicherer Software. Um hier Angriffe zu verstehen und Maßnahmen dagegen zu entwickeln muss man kein C können. SDN ist ein schönes Beispiel: Implementierungen gibt es in allen Sprachen. Jeder kann damit rumspielen, Fehler in den Konzepten suchen, Bugs ausnutzen, egal, ob man C kann oder nicht. C ist heute nur für die wichtig, die wissen, wie man damit umgeht. Den Umgang lernt man aber heute nicht mehr in der Freizeit.
 
Zuletzt bearbeitet:
C ist heutzutage für Hobbyentwickler, die nichts mit Microcontrollern machen, ungeeignet.

Okay, damit kann ich schon eher leben :)

Für mich ist es immer schwer jemanden als Hacker zu bezeichnen, der metasploit einsetzen kann oder durch relativ simple/vorgekaute Dinge Systeme lahmlegt. Sowas fällt für mich eher Richtung Crackers oder gar Script-Kiddie.

SDN ist ein schönes Beispiel: Implementierungen gibt es in allen Sprachen.

Kommt wohl immer auf den Hersteller an. Darf auch bald an ein paar SDN-Switches rumspielen ... mal schauen :D

Meine persönliche Meinung bleibt wohl auch, dass man sich zumindest grundsätzlich als "Hacker" mit Betriebssysteme und damit mit dem Kernel auseinandersetzt. Nicht nur in Abstraktionen sondern eben auch in den Linux-Kernel blicken - sei es nur mal eine LKM zu schreiben ... aber so ganz und gar keine Ahnung *grusel*

Grüße,
Scutus
 
Für mich ist es immer schwer jemanden als Hacker zu bezeichnen, der metasploit einsetzen kann oder durch relativ simple/vorgekaute Dinge Systeme lahmlegt. Sowas fällt für mich eher Richtung Crackers oder gar Script-Kiddie.
Metasploit einsetzen und Metasploit benutzen sind 2 verschiedene Paar Schuhe. Denn dieses Framework kann man schliesslich auch nutzen um eigene Exploits zu erstellen. Und das wird man ohne entsprechende Kenntnisse genau so wenig hinbekommen wie in C. Von daher würde ich Leute, die Metasploit verwenden, nicht so spontan aburteilen. Gerade im professionellen Pentesting-Bereich spart es eine Menge Arbeit/Getippe.

Meine persönliche Meinung bleibt wohl auch, dass man sich zumindest grundsätzlich als "Hacker" mit Betriebssysteme und damit mit dem Kernel auseinandersetzt. Nicht nur in Abstraktionen sondern eben auch in den Linux-Kernel blicken - sei es nur mal eine LKM zu schreiben ... aber so ganz und gar keine Ahnung *grusel*

In dieser Hinsicht schliesse ich mich vollkommen an, auch wenn es nicht unbedingt der Linux-Kernel sein muss, der ein Paradebeispiel für ein unsicheres Betriebssystem ist. Auf jeden Fall ist es hilfreich, wenn man bestimmte Mechanismen im Betriebssystemkernel verstanden hat und nutzen kann. Vor allem bei Linux/Unix sind Dinge wie das Ausklinken von Prozessen aus der Kernel-eignen Prozessliste oder Eingriffe in die Kommunikation zwischen Prozessen unerlässliche Techniken für bestimmte Angriffsformen. Und die sind nur auf Kernel-Ebene umsetzbar, wofür man wiederum C braucht.

Wie versteckt der klassische Linux-Bot seinen Prozess? Er benennt ihn einfach um, was aber im ProcFS leicht zu finden ist. Wie tut es ein LKM-Trojaner? Er klinkt die PIDs seiner Prozesse aus dem ProcFS aus. Mach das mal mit Java oder Python. ;)

Und wenn man sich mal anschaut, was Firmen für Leute rekrutieren, die Produkte des "Internets der Dinge" herstellen, stellt man auch fest, dass dort wieder mehr und mehr C-Programmierer gefragt sind. C ist also ganz und gar nicht eine Sprache der 90er. Denn bis heute haben es nur wenige Sprachen geschafft so kleine und effiziente Binaries zu produzieren, wie es mit C möglich ist. C-Programme kann man enorm optimieren, wofür die meisten anderen Hochsprachen keinen Raum lassen. Gerade im mobilen Sektor ist das heutzutage wieder ein wichtiges Kriterium.

Es gibt also einige Gründe, die für C sprechen. Nicht zuletzt die Notwendigkeit sich nicht nur mit der Sprache sondern auch mit Dingen wie Speicherbelegung zu befassen, was beim Erlernen von C quasi automatisch passiert, weil es einfach notwendig ist um C zu schreiben.

Aber im Endeffekt bleibt auch bei der Frage "C oder nicht C" wieder einmal als wichtigster Punkt: Brauch ich das überhaupt? Und da geb ich SchwarzeBeere total Recht. Man muss sich heutzutage spezialisieren, denn die Architektur moderner PC-Hardware, also x86-Architekturen, ist viel zu komplex geworden. Schon der Schaltplan eines Pentium-II-Prozessors benötigte in ausgedruckter Form eine ganze Flugzeughalle um ausgebreitet zu werden. Und nur bei sehr wenigen Spezialisierungen wird C benötigt. Primär sind das die systemnahe und hardwarenahe Programmierung. Für den Rest gibt es geeignetere Sprachen.
 
Andererseits sollte man vielleicht noch erwähnen, dass viele (nicht hardwarenahe) Open Source Projekte (besonders im Linux-Umfeld) in C oder C++ programmiert sind:

C: GTK, diverse Window-Manager (z.B. Metacity), SDL, gnupg und generell viel GNU-Software, git etc

C++: Qt, WebKit, diverse Window-Manager(z.B. IceWM), SFML, FLTK, Firefox (auch C) etc

Daher kann es erforderlich sein, um mitzuarbeiten C/C++ zu können.

Sind natürlich einige mehr, aber ich weiß auch nicht alles :)
 
Ein weiteres Anwendungsgebiet für C/C++ sind Anwendungen im Industriebereich, die harte Echtzeitbedingungen erfüllen müssen. Dies lässt sich nur erreichen, wenn man die Speicherverwaltung selbst in die Hand nimmt und um das zu verstehen sind Assemblerkenntisse doch recht nützlich.
 
Zurück
Oben