Je suis sur le point de commencer un diplôme de sécurité informatique de 4 ans à Purdue. Le diplôme ne nécessite aucun cours de programmation. Donc, la seule fois où je pourrai en prendre un, c'est un stage facultatif. Donc, la plupart de mon apprentissage se fera par moi-même. Au début de ma dernière année de lycée, j'ai décidé de passer complètement à Linux. Jusqu'à présent, j'ai appris quelques trucs sur Linux et la sécurité. Cependant, je pense également qu'il sera important pour moi d'apprendre également quelques langages de programmation.
Fondamentalement, je prévois d'apprendre à programmer côte à côte avec l'apprentissage de l'utilisation de Vim. Ce sera donc très probablement un processus lent. En fin de compte, je pense que cela en vaudra la peine. Comme je l'ai dit, j'entre dans la sécurité, donc je vais surtout créer des applications liées à la sécurité, dont la plupart seront liées au réseau. Je voudrais également commencer à développer des applications Android, mais ce sera plus tard.
Cela dit, j'ai quelques idées. Je pensais commencer par JavaScript, car il est multiplateforme, et je l'ai déjà vu suggéré. J'ai également beaucoup entendu parler de Ruby ou je pourrais suivre la voie Linux naturelle avec C. Quelle direction dois-je prendre?
Vous constaterez que tout le monde recommandera à peu près sa langue préférée. Ma langue préférée est Perl, c'est ce que je recommande. :) Cependant, au-delà de mes préférences personnelles, il existe de bonnes raisons pour lesquelles vous devriez envisager d'utiliser perl:
Tout d'abord, perl est un merveilleux langage à usage général. Il est facile de démarrer en perl en écrivant des scripts simples pour faire le même genre de choses que vous faites dans les scripts shell, comme manipuler des fichiers et prendre des décisions en fonction des entrées de l'utilisateur. Cela fournit une introduction très facile et progressive aux idées générales de programmation. Perl existe depuis un certain temps, il existe donc de nombreuses ressources (livres et sites Web) pour commencer.
Deuxièmement, perl est un langage incroyablement puissant et expressif qui prend en charge toutes les fonctionnalités de programmation modernes. Je l'utilise depuis plus de quinze ans et j'apprends toujours de nouvelles façons de faire les choses plus efficacement. Par exemple, si vous souhaitez explorer la programmation orientée objet, perl a cela (en particulier via Moose ).
Troisièmement, perl est livré avec la puissance et la flexibilité presque infinies de son référentiel de modules complémentaires officiel, CPAN . Par exemple, pour suivre l'idée d'écrire un logiciel de sécurité, supposons que vous souhaitiez développer une sorte de scanner de sécurité réseau personnalisé. Au lieu d'écrire tout cela vous-même, vous pouvez commencer par utiliser NMAP :: Scanner comme moteur de numérisation, puis écrire vos propres ajustements et améliorations en plus de cela.
Enfin, si vous voulez explorer la programmation Web, Perl l'a aussi. Catalyst est un moyen moderne et populaire d'écrire des logiciels Web en Perl , qui fournit un cadre Web MVC moderne pour développer rapidement n'importe quel type d'application Web.
En combinant tout cela, l'avantage de perl est qu'il vous permet de commencer à écrire de petits scripts et programmes en ligne de commande et de devenir progressivement des applications modernes complètes. Bien sûr, le prix de cette flexibilité est la complexité. C'est à vous d'étudier et d'apprendre à faire les choses correctement, perl n'applique pas les bonnes pratiques comme le font les autres langages. Personnellement, j'aime cette liberté, particulièrement associée à toutes les excellentes ressources disponibles sur le Web pour apprendre à utiliser Perl.
la source
Trois langues vous tiendront en bonne place. Par ordre décroissant d'importance (c'est-à-dire que le premier est le plus important):
la source
script language
, commepython
ouPHP
.Vous devez apprendre plusieurs langues. Je suggérerais de commencer par Python. Il est largement recommandé d'être facile à apprendre et d'être très utile, de nombreux excellents documents d'autoformation sont disponibles gratuitement, et je suppose qu'il est largement utilisé par les professionnels de la sécurité informatique. Presque chaque fois que je vois du code de démonstration pour les professionnels de la sécurité, c'est Python.
la source
Suis-je le seul à penser OMG !!!! À ce point?
Je dirais que oui. Bien que vous ne vous attendiez pas vraiment à devenir un programmeur compétent, vous avez probablement besoin des compétences requises pour simuler / recréer des attaques et comprendre le fonctionnement du processus de programmation. Vous aurez également besoin des compétences nécessaires pour analyser les données et extraire des informations à partir de sources en vrac (comme les journaux). JimB a mentionné bash - et même si vous l'utiliserez sans aucun doute - cela ne prend que quelques heures pour apprendre les éléments essentiels. En fait, le seul endroit où vous verrez probablement bash est sur les systèmes Linux - mais les autres shells sont très similaires.
Je recommanderais d'apprendre awk et / ou Perl pour le crunching de données. Ne vous souciez pas de l'obligation de cocher une case orientée objet - mais je recommanderais également de regarder les langages non procéduraux.
L'apprentissage C vous exposera également à beaucoup d'informations sur la façon dont le code se transforme en programme exécutable (la compilation n'est qu'une étape dans un processus très complexe).
Le choix évident pour quelqu'un intéressé par le développement Android / mobile serait java - mais java essaie très fort d'empêcher le développeur d'avoir à faire face aux réalités du fonctionnement et des protocoles - d'après mon expérience, c'est là que vous rencontrez des problèmes de sécurité avec Java applications. c'est-à-dire que cela pourrait vous aider à atteindre votre objectif ultime, et il sera joli sur votre CV, mais ne vous attendez pas à apprendre Java pour compléter vos connaissances en sécurité.
la source
Mon conseil:
bash
(et ses semblables) ne sont pas des langages de programmation à usage général. Bien qu'il soit possible d'accomplir des scripts sophistiqués,bash
ce n'est pas la meilleure façon d'apprendre la programmation en général. C'est le moyen le plus naturel d'accomplir des tâches d'administration de systèmes qui tournent principalement autour de l'exécution d'autres programmes, de la gestion de leurs fichiers et répertoires de données et du marshaling des entrées et sorties vers et depuis ces derniers. Sibash
c'est un marteau, réservez-le aux problèmes qui ressemblent vraiment à des clous. Apprendre à faire quelque chose de non trivial dansbash
sera beaucoup plus facile si vous apprenez de très petits sous-ensembles desed
etawk
(puisque la manipulation de chaîne dansbash
est largement inspirée par la syntaxe d'opérations similaires dans ces "petits" langages).Je vous recommande de lire un texte d'introduction sur C et de passer un peu de temps à exécuter les commandes
strace
etltrace
sur certaines commandes utilitaires simples commels
etmkdir
et/bin/echo
etc. (En fait, ces jours-ci, je suggèreltrace -S
au lieu destrace
mais incite à la sortie des deux commandes et dans laltrace
sortie augmentée par l'-S
option sera extrêmement éducative).C est le langage de programmation principal dans lequel le noyau Linux et la libc GNU sont écrits. (Les petites pièces sont en montage). Presque tous les programmes sur un système Linux (ou autre système UNIX) sont liés aux bibliothèques C (libc). Les principaux interprètes Perl et Python (et la plupart des autres langages de script) sont également écrits en C. Ces programmes (le noyau, les bibliothèques système communes et les divers interprètes de langage de script) sont tous écrits par des programmeurs C dont la conception et les fonctionnalités sont fortement influencées. par leurs implémentations sous-jacentes. Ainsi, une compréhension plus approfondie de l'un de ces éléments implique éventuellement de comprendre C. Vous n'avez pas besoin de connaître quoi que ce soit sur C ++ ou Java pour comprendre la programmation à ce niveau. (Ceux-ci peuvent chacun être intéressants et nécessaires en fonction de votre carrière,
Donc, si vous êtes d'accord avec mes prémisses jusqu'à présent, nous l'avons réduit à un choix entre Perl et Python.
Voici où les véritables guerres de flammes commencent.
Mon conseil est de se concentrer d'abord sur Python (2.x). Python a une syntaxe relativement simple et cohérente. Vous pouvez apprendre les bases de la syntaxe Python en quelques heures et c'est la grande majorité de la syntaxe que vous rencontrerez jamais. Il n'y a que quelques fonctionnalités (listes de compréhension, expressions de générateur, décorateurs) qui sont des rides de la syntaxe de base. Ainsi, la plupart de vos efforts dans l'apprentissage de Python seront consacrés à l'apprentissage des bibliothèques standard étendues et à essayer de trouver la "meilleure" façon de les utiliser (et de déterminer quels sont les ensembles spécifiques d'exceptions qui méritent d'être manipulés pour rendre vos programmes robustes) et, surtout, dans l'apprentissage des concepts sous-jacents.
Je pense que les bibliothèques étendues de Python et sa syntaxe relativement simple ont deux inconvénients distincts.
Tout d'abord, lorsque vous apprenez à faire quelque chose à un niveau très élevé en Python, vous pourriez trouver fastidieux l'idée de devoir travailler à un niveau inférieur. Où je travaille Perl est la norme. Je prototype mon travail en Python, où je sais que je peux le faire fonctionner beaucoup plus rapidement et de manière fiable qu'en Perl; puis je redoute de devoir passer et de le porter à Perl pour mes collègues. (J'étais raisonnablement bon en Perl des années avant d'utiliser Python --- ce n'est donc pas une simple question de familiarité).
L'autre inconvénient est qu'il est parfois difficile de trouver le moyen le plus élevé d'accomplir une tâche donnée en Python. Par exemple, pour récupérer une page Web, vous pouvez d'abord essayer de le faire avec des sockets de bas niveau ... ce qui fonctionnera. Cependant, vous dupliqueriez pas mal de code que vous pouvez déjà trouver, y compris dans les modules
urllib
et / ouurllib2
. Le fait même que les bibliothèques standard, à partir de la version 2.7.1, incluent les deux fait mon point. Dans la mesure du possible, les responsables de Python ont étendu les anciens modules et API de manière transparente; cependant, il existe des dizaines de cas où Python conserve deux ou trois modules où l'extension transparente n'était pas possible pour une raison quelconque. (Pour un autre exemple , vous pouvez regarder les options pour l' analyse des options de ligne de commande:argparse
,optparse
etgetopt
. Il n'y a pas de mal à écrire vos programmes en utilisantgetopt
(le plus ancien d'entre eux). Pour les utilitaires très simples avec peu d'options et une convention d'appel rigide (utilisée uniquement par un petit groupe de personnes, par exemple), alors il n'y a rien de mal à marcher avecsys.argv
soi-même. Cependant, il vaut généralement la peine de lire attentivement les documents et de suivre les liens au bas des modules de niveau plus ancien ou inférieur qui décrivent les fonctionnalités plus récentes ou de niveau supérieur disponibles.Mon conseil est basé sur mon opinion que vous voulez vous concentrer sur des concepts plus profonds et ne pas avoir à consacrer beaucoup de temps et d'efforts à des problèmes syntaxiques et linguistiques spécifiques. Comprendre quand utiliser un sous-processus, par rapport à un thread, ou les fonctionnalités de multi-traitement incluses avec Python a relativement peu à voir avec le langage et tout à voir avec la maîtrise de la programmation, quel que soit le langage. (Au moment où vous pouvez comprendre les arguments concernant le modèle piloté par événements de Twisted par rapport au threading et au multitraitement, vous aurez probablement maîtrisé Python et serez prêt à programmer dans n'importe quel langage).
Le contre-argument, pour Perl, est simple et pratique. Il y a pas mal d'autres emplois qui demanderont spécifiquement des compétences avec Perl. Perl est un langage puissant et possède des bibliothèques extrêmement étendues. (Le noyau de Perl distribué avec la plupart des systèmes Linux couvre une gamme de fonctionnalités plus petite que les bibliothèques Python standard; il est supposé que vous aurez installé un nombre important de packages supplémentaires à partir de votre distribution ou via CPAN --- Comprehensive Perl Archive Réseau). (En revanche, il y a moins de modules et de packages Python que je dois récupérer séparément ... ceux-ci sont disponibles auprès de PyPI --- l'index des packages Python).
Donc, si vous apprenez Perl, vous aurez une longueur d'avance pour trouver des emplois, en particulier des administrateurs système, à court terme. Cependant, la syntaxe de Perl est ... eh bien ... selon les mots de certains de ses propres passionnés ... "pathologiquement éclectique!" Perl peut être extrêmement concis et son code est rempli de ponctuation. Ceux qui l'aiment argueront sans cesse que c'est "facile" et est parfaitement logique --- et auront des possibilités infinies de le faire dans des forums qui sont remplis de confusion sur la façon dont un extrait de code donné a été interprété. La syntaxe et le langage utilisés dans la documentation et par ceux qui la prennent en charge dans les forums publics sont nuancés au point où vous pouvez consacrer des efforts considérables à les apprendre.
Maintenant, veuillez vous rendre compte que ce commentaire précédent est subjectif et biaisé. Il est possible que vous essayiez Perl et que sa syntaxe soit intuitive et agréable. Si oui, plus de pouvoir pour vous. Cependant, je trouve personnellement que ma compréhension des particularités de Perl se détériore très rapidement. Les principes fondamentaux que je retiens, mais je trouve que c'est difficile chaque fois que je dois y revenir pour plus de quelques lignes de code.
Il y a beaucoup d'autres langages que vous étudieriez, Java, Lisp et Scheme, TCL, Scala, etc. Cependant, je suggère de commencer par celui qui offre le meilleur équilibre entre utilité et simplicité.
la source
Dans le monde Linux, vous devez connaître deux choses fondamentales:
Regular Expression
. C'est un must.RegEx
est un "langage" universel, une fois que vous savez utiliser l'expression régulière, votre vie sera beaucoup plus facile :-)quick & dirty
" est très courant dans le monde Linux. Si vous pouvez faire faire votre travail, quelle que soit la laideur de votre solution, vous avez fait votre travail.Donc, si vous voulez apprendre une langue sous Linux, vous devriez choisir un
script language
, commepython
,PHP
ou mêmebash scripting
.Et, ma recommandation est
PHP
. C'est simple et moche. Il a un manuel en ligne détaillé . Il a un bonRegEx
support. C'est tout.la source
Vous pouvez effectuer presque toutes les tâches dans presque toutes les langues, donc le bon choix est largement dicté par le problème que vous résolvez.
Il vaut vraiment la peine de connaître les langues des catégories suivantes:
Je ferais un effort pour apprendre le C / C ++, car cela permet une corruption de pile et un accès direct à la mémoire. Ceci est important si vous souhaitez tester des problèmes de sécurité. De nombreux langages ont une syntaxe de type C (y compris JavaScript), c'est donc un bon tremplin.
Si vous travaillez beaucoup dans un shell, ce que je suppose que vous êtes en train d'apprendre Vim, vous finirez par apprendre des scripts de base du shell comme effet secondaire. UNIX Power Tools était un bon livre pour apprendre des choses plus avancées; Je ne sais pas si c'est encore publié.
PHP peut également être un bon langage à apprendre; le principal avantage qu'il offre aux nouveaux programmeurs est que de nombreuses fonctionnalités sont intégrées, plutôt que dans une bibliothèque à laquelle vous devez vous connecter (ce qui n'est pas une tâche complexe). Pour cette raison, la navigation dans les principaux documents vous apprendra beaucoup de choses.
la source
Tout d'abord, quelques conseils négatifs:
Ne faites pas cela. Trouvez un éditeur vraiment confortable. Apprendre à la fois la langue et l'éditeur est trois fois plus difficile que de les apprendre dans l'ordre (évidemment, l'éditeur devrait commencer par :-))
Applications de sécurité liées au réseau? C est un choix évident ici. Vous devrez accéder au réseau au niveau de l'API système, ce qui signifie que C est la voie à suivre. Bien sûr, cela ne signifie pas que tout doit être en C - une bibliothèque C + un
$favorite-high-level-language
wrapper peut vous éviter les tracas liés au C dans les parties qui n'ont pas besoin de C.Je parie que cela a été suggéré dans un contexte différent du vôtre. JavaScript a ses points forts mais ce n'est pas encore un bon langage généraliste. JS n'a pas de bibliothèques standard comparables à celles disponibles pour C, Python, Perl, Ruby, Java et compagnie.
En parlant de
$favorite-high-level-language
- mon conseil est d'aller avec Python. Il s'interface bien avec C, il est livré avec beaucoup de bibliothèques utiles et a beaucoup plus de bibliothèques disponibles en tant que modules complémentaires.la source
Rien de mal à apprendre Javascript, mais il ne fonctionne que sous un navigateur, donc votre programmation sera limitée aux applications liées aux pages Web.
Il existe probablement autant de réponses au «qu'est-ce qu'un bon langage de programmation pour commencer» qu'il y a de langages. Ma valeur de tuppence est que vous pourriez faire pire que de commencer avec des scripts shell de base, juste voir ce que vous pouvez faire pour automatiser les tâches sans utiliser quoi que ce soit au-delà du shell, puis étendre cela en utilisant Perl, ou un langage similaire qui est né de la nécessité de le faire des tâches plus complexes que le shell n'est capable, après cela, et si vous êtes vraiment intéressé, cela ne prendra que quelques semaines, commencez à utiliser C ou un dérivé.
la source
Mes recommandations? Hmmm. Eh bien, vous devrez peut-être décider au fur et à mesure. Pour la plage saine et bien arrondie, vous pouvez suivre la voie habituelle du degré CS, peut-être pas dans cet ordre.
(1) C / C ++ - Vous pouvez obtenir le contenu orienté objet, et au moins vous aurez essayé. C ++ est la norme «professionnelle». (2) Assemblage (juste pour un peu - cela vous aidera à comprendre le fonctionnement réel du processeur, de la mémoire, etc. - vous n'avez pas à vous marier.) (3) Python / Perl / Bash - Obtenez ces les langages de script vers le bas, ils seront plus utiles pour votre niveau de Linux (4) PHP / Ruby, MySQL et HTML - Obtenez simplement votre programmation Web! Vous comprendrez l'ensemble du processus d'interaction serveur-client, un autre niveau informatique.
Besoin de concepts utiles? AI, réseaux de neurones. Ceux-ci devraient vous compléter.
Vous pouvez choisir l'une d'entre elles ou les toucher toutes. Ma langue? Tous, au besoin, mais je programme depuis 1984 et j'ai un diplôme CS, des jeux écrits et toutes sortes d'applications de systèmes embarqués. C'est ce que je fais. Vous devez découvrir qui vous êtes et ce que VOUS faites. Assurez-vous simplement que vous vous amusez.
Prendre plaisir!
la source
oups, mauvaise lecture de la sécurité des informations pour les systèmes d'information ... eh bien la plupart de cela s'applique toujours
Java
Honnêtement, si vous travaillez sous Linux et que vous suivez un cours de programmation débutant en Java, puis que vous poursuivez avec quelques autres cours de programmation, les autres outils comme Bash sed / awk, etc ... devraient en quelque sorte se mettre en place. Si vous vous lancez vraiment dans les systèmes, vous pourriez ramasser du C plus tard, mais je ne dirais pas qu'il est très demandé et je ne dirais même pas que c'est une exigence d'être un gars des systèmes - à moins que vous ne soyez vraiment dans les internes.
YMMV
la source