<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.unix4fun.net/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>unix4fun</title>
  <link>http://blog.unix4fun.net/</link>
  <atom:link href="http://blog.unix4fun.net:82/feed/rss2" rel="self" type="application/rss+xml"/>
  <description>Just code, unix and stuff that matters to us.</description>
  <language>fr</language>
  <pubDate>Mon, 16 Jan 2012 14:19:09 +0100</pubDate>
  <copyright>(c) 2008 unix4fun</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Et son nom, il le signe de la pointe de l'épée ...</title>
    <link>http://blog.unix4fun.net/post/2011/12/30/Et-son-nom%2C-il-le-signe-de-la-pointe-de-l-%C3%A9p%C3%A9e-...</link>
    <guid isPermaLink="false">urn:md5:fb38fe97861ba38d6e8fc59e6520d406</guid>
    <pubDate>Fri, 30 Dec 2011 19:02:00 +0100</pubDate>
    <dc:creator>redseb</dc:creator>
        <category>admin</category><category>mail</category><category>postfix</category>    
    <description>    &lt;p&gt;... ou à la fin de son mail (je sais c'est pas ça la chanson).&lt;/p&gt;
&lt;p&gt;Et comme il est fainéant, il aimerait bien que ce soit automatique. Enfin
surtout ses copains (qui sont pires que lui).&lt;/p&gt;
&lt;p&gt;Si vous avez suivi vous avez vu que je découvre Postfix et son monde
merveilleux. Ainsi j'ai découvert (bin oui puisque je découvre) que dans ce
contexte là, quand on parle de signature, on en revient souvent à &lt;a href=&quot;http://www.pldaniels.com/altermime/&quot; hreflang=&quot;en&quot;&gt;altermime&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;J'ai donc mis en place cet outil plutôt sympa grâce à tous les supers
tutoriaux qu'on trouve sur le net. Ma maigre contribution de cette fin d'année
sera de vous donner le script qui permet d'avoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un mécanisme simple pour gérer les signatures user par user&lt;/li&gt;
&lt;li&gt;un mécanisme simple pour gérer un disclaimer générique à un domaine&lt;/li&gt;
&lt;li&gt;un mécanisme, je vous le donne en mille, simple, pour ne pas bégayer
(signature en double etc)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Voilà le bousin :&lt;/p&gt;
&lt;pre&gt;
#!/bin/sh
ALTERMIME=/usr/bin/altermime
ALTERMIME_DIR=/var/spool/altermime
SENDMAIL=/usr/sbin/sendmail
TEMPFAIL=75
UNAVAILABLE=69
cd $ALTERMIME_DIR || { echo $ALTERMIME_DIR does not exist; exit $TEMPFAIL; }
trap &amp;quot;rm -f in.$$&amp;quot; 0 1 2 3 15
cat &amp;gt;in.$$ || { echo Cannot write to $ALTERMIME_DIR; exit $TEMPFAIL; }

# d'abord on teste le mail pour voir si on n'a pas déjà rajouté le disclaimer
processed=`grep -m 1 &amp;quot;X-Disclaimer: yes&amp;quot; in.$$`
if [ -z &amp;quot;$processed&amp;quot; ]; then
        from_address=`grep -m 1 &amp;quot;From:&amp;quot; in.$$ | cut -d '&amp;lt;' -f 2 | cut -d '&amp;gt;' -f 1 | tr '@' '_'`
        from_domain=`grep -m 1 &amp;quot;From:&amp;quot; in.$$ | cut -d '@' -f 2 | cut -d '&amp;gt;' -f 1`
        signature_file=&amp;quot;/etc/postfix/altermime/signatures/$from_address&amp;quot;
        disclaimer_file=&amp;quot;/etc/postfix/altermime/disclaimers/$from_domain&amp;quot;
        # on cherche si on a une signature pour cet expéditeur
        if [ -e ${signature_file}.txt -a -e ${signature_file}.html ]; then
                $ALTERMIME --input=in.$$ \
                --disclaimer=${signature_file}.txt \
                --disclaimer-html=${signature_file}.html \
                --xheader=&amp;quot;X-Disclaimer: yes&amp;quot; || \
                { echo Message content rejected; exit $EX_UNAVAILABLE; }
        fi
        # puis si on a un disclaimer générique pour son domaine
        if [ -e ${disclaimer_file}.txt -a -e ${disclaimer_file}.html ]; then
                $ALTERMIME --input=in.$$ \
                --disclaimer=${disclaimer_file}.txt \
                --disclaimer-html=${disclaimer_file}.html \
                --xheader=&amp;quot;X-Disclaimer: yes&amp;quot; || \
                { echo Message content rejected; exit $EX_UNAVAILABLE; }
        fi
fi

$SENDMAIL &amp;quot;$@&amp;quot; &amp;lt;in.$$
exit $?
&lt;/pre&gt;
&lt;p&gt;Si vous vous intéressez un peu au sujet vous verrez qu'une grosse partie de
ce script se trouve sur quasiment toutes les pages qui parlent d'altermime, je
remercie donc son auteur initial.&lt;/p&gt;
&lt;p&gt;En ce qui concerne mes ajouts :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pour les signatures il suffit de rajouter des fichiers
utilisateur_domaine.tld.{txt,html} dans /etc/postfix/altermime/signatures avec
dedans ce qui va bien&lt;/li&gt;
&lt;li&gt;pour les disclaimers génériques, dans /etc/postfix/altermime/disclaimers
des fichiers domaine.tld.{txt,html} selon la même philosophie&lt;/li&gt;
&lt;li&gt;pour l'anti bégaiement (qui se produit rarement mais dans des cas de
redirection entre domaines), un simple X-Header&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Voilà, je pense que c'est à peu près tout !&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2011/12/30/Et-son-nom%2C-il-le-signe-de-la-pointe-de-l-%C3%A9p%C3%A9e-...#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2011/12/30/Et-son-nom%2C-il-le-signe-de-la-pointe-de-l-%C3%A9p%C3%A9e-...#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/657797</wfw:commentRss>
      </item>
    
  <item>
    <title>ahhh il reste des gens drôles! pfiiiouuu j'ai flippe!</title>
    <link>http://blog.unix4fun.net/post/2011/10/18/ahhh-il-reste-des-gens-dr%C3%B4les%21-pfiiiouuu-j-ai-flippe%21</link>
    <guid isPermaLink="false">urn:md5:b2bce200bfa1ede204211b9099b1052a</guid>
    <pubDate>Tue, 18 Oct 2011 17:50:00 +0200</pubDate>
    <dc:creator>eau</dc:creator>
        <category>geeking</category>
        <category>C</category><category>code</category><category>fun</category><category>OS</category>    
    <description>    &lt;p&gt;En ces temps de gang bang d'ego généralisé, de benchmarking de performance
sur l'échelle Ritchie (RIP) et autre courses a la réussite sociale, il reste
des gens dont la carriere et la publication frénétique d'information pour voir
son nombre de hits et ses fans augmenter toute en mimant le désintérêt et le
detachement n'est pas au centre de leur vie et arrivent a s'amuser et surtout a
avoir de l'auto derision, ca m'a fait hurler de rire alors que c'est
completement debile, mais c'est pas grave, j'ai ris, ca fait du bien! donc je
&amp;quot;share&amp;quot; :)&lt;/p&gt;
&lt;p&gt;Sa premiere idee farfelue (hahahaha):&lt;/p&gt;
&lt;pre&gt;
/*
** pam_happy_hour.c - PAM happy hour auth module. Solaris 2.6+
**      During happy hour passwords aren't required, any will do.
**
[...]
&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://www.brendangregg.com/Specials/pam_happy_hour.c&quot; hreflang=&quot;en&quot;&gt;pam_happy_hour.c&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Allez j'en pioche une autre dans le tas (:~)):&lt;/p&gt;
&lt;pre&gt;
# maybe - companion to /usr/bin/true and /usr/bin/false.
#
# This should be installed in your system location, eg /usr/bin/maybe.
[...]
&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://www.brendangregg.com/Specials/maybe&quot; hreflang=&quot;en&quot;&gt;maybe&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Et il en a fait pleins d'autre aussi farfelue a voir la:&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.brendangregg.com/Specials/&quot; hreflang=&quot;en&quot;&gt;huhuhuh&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2011/10/18/ahhh-il-reste-des-gens-dr%C3%B4les%21-pfiiiouuu-j-ai-flippe%21#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2011/10/18/ahhh-il-reste-des-gens-dr%C3%B4les%21-pfiiiouuu-j-ai-flippe%21#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/644601</wfw:commentRss>
      </item>
    
  <item>
    <title>Chacun sa route, chacun son chemin, passe le message à ton voisin ...</title>
    <link>http://blog.unix4fun.net/post/2011/10/17/Une-place-pour-chaque-chose%2C-et-chaque-chose-%C3%A0-sa-place-%21</link>
    <guid isPermaLink="false">urn:md5:2af9059975a1196985c1f028dfe19175</guid>
    <pubDate>Mon, 17 Oct 2011 15:46:00 +0200</pubDate>
    <dc:creator>redseb</dc:creator>
        <category>admin</category><category>postfix</category>    
    <description>    &lt;p&gt;En ces temps de restriction budgétaire et de dégraissage du mammouth, chacun
se doit d'y aller de son petit effort pour réduire les coût. En ce qui me
concerne, cela s'est concrétisé par un peu de tuning sur un serveur de mail
postfix/docevot/amavis-et-ses-copains increvable afin de l'utiliser pour
plusieurs domaines qui n'ont rien à voir entre eux.&lt;br /&gt;
&lt;br /&gt;
Mon besoin, simple en soit, et, au final, simple à traiter, se résume ainsi
:&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2 organisations, avec deux domaines (organisation1.fr et
organisation2.com)&lt;/li&gt;
&lt;li&gt;2 smarthosts (mx.organisation1.fr et mx.organisation2.com)&lt;/li&gt;
&lt;li&gt;1 serveur mail pour gérer les deux domaines, mais chacun utilisant en
entrée et en sortie son smarthost (relayhost chez postfix) respectif&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
Je n'insulterai personne en expliquant comment gérer un smarthost
(transport.map et relayhost sont nos amis) ou comment rajouter le support d'un
domaine ...&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est d'utiliser un smarthost spécifique en sortie, c'est là que la
magie de postfix opère : il suffit d'utiliser la directive bien nommée
&lt;strong&gt;sender_dependent_relayhost_map&lt;/strong&gt; avec en paramètre un fichier au
format &amp;quot;transport&amp;quot;, ce qui donne la chose suivante :&lt;/p&gt;
&lt;pre&gt;
@organisation1.fr       [mx.organisation1.fr]
@organisation2.com      [mx.organisation2.com]
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
Et voilà, comme ça tout le trafic entrant et sortant passe par les smarthosts
respectifs des deux organisations.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2011/10/17/Une-place-pour-chaque-chose%2C-et-chaque-chose-%C3%A0-sa-place-%21#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2011/10/17/Une-place-pour-chaque-chose%2C-et-chaque-chose-%C3%A0-sa-place-%21#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/644275</wfw:commentRss>
      </item>
    
  <item>
    <title>Mon Toy-project du moment ! Un FS sur le cloud !</title>
    <link>http://blog.unix4fun.net/post/2011/10/07/Mon-Toy-project-du-moment-%21-Un-FS-sur-le-cloud-%21</link>
    <guid isPermaLink="false">urn:md5:b2d1e59cbe765feff99cfc5930d41a5e</guid>
    <pubDate>Fri, 07 Oct 2011 15:15:00 +0200</pubDate>
    <dc:creator>poz</dc:creator>
        <category>geeking</category>
        <category>C</category><category>code</category><category>filesystem</category><category>fun</category><category>network</category><category>storage</category>    
    <description>    &lt;p&gt;Beh voilà, encore un peu d'auto-promotion. Et en fait j'ai un peu menti, ça
fait plusieurs mois que je ne commit qu'un bout de code par-ci ou par-là.&lt;/p&gt;
&lt;p&gt;Ma société a écrit une &lt;a href=&quot;http://github.com/scality/droplet&quot;&gt;bibliothèque en open source&lt;/a&gt; pour
travailler sur le cloud (différents protocoles supportés, mais je vous laisse
découvrir ça). Bref, je me suis basé sur cette lib pour implémenter un
filesystem en utilisant &lt;a href=&quot;http://fuse.sourceforge.net/&quot;&gt;FUSE&lt;/a&gt; :
&lt;a href=&quot;http://github.com/pozdnychev/dropletfs-fuse&quot;&gt;dropletfs&lt;/a&gt; ;
c'est lent (car le &lt;em&gt;design&lt;/em&gt; est simpliste et pas optimisé), mais
rigolo.&lt;/p&gt;
&lt;p&gt;Toutes les &lt;em&gt;features&lt;/em&gt; d'un FS posix ne sont pas présentes, loin de là
(gérer les hardlinks est plutôt compliqué), mais pour un usage basique, ça
'juste marche'.&lt;/p&gt;
&lt;p&gt;Une petite démo intéractive (nécessite le package &lt;a href=&quot;http://0xcc.net/ttyrec&quot;&gt;ttyrec&lt;/a&gt;) : &lt;a href=&quot;http://blog.unix4fun.net/public/dplfs.demo.rec&quot;&gt;ici&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2011/10/07/Mon-Toy-project-du-moment-%21-Un-FS-sur-le-cloud-%21#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2011/10/07/Mon-Toy-project-du-moment-%21-Un-FS-sur-le-cloud-%21#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/642585</wfw:commentRss>
      </item>
    
  <item>
    <title>SPLONK !</title>
    <link>http://blog.unix4fun.net/post/2011/09/16/SPLONK-%21</link>
    <guid isPermaLink="false">urn:md5:38100f94f68ea0a320a952d30f1514df</guid>
    <pubDate>Fri, 16 Sep 2011 19:14:00 +0200</pubDate>
    <dc:creator>mgu</dc:creator>
        <category>geeking</category>
        <category>admin</category><category>architecture</category><category>logging</category><category>network</category><category>system</category>    
    <description>    &lt;p&gt;Si, comme moi, vous vous battez continuellement dans vos logs avec
grep/sed/awk/cut/tail/paprika (cherchez pas c'est de l'humour), alors vous avez
certainement deja entendu parlé de &lt;a href=&quot;http://www.splunk.com&quot; hreflang=&quot;en&quot;&gt;splunk&lt;/a&gt;. Pour faire très court, splunk, c'est un peu le &lt;em&gt;Google&lt;/em&gt;
des logs : c'est ultra pratique (et intuitif) si vous cherchez à faire une
recherche dans 45 millions de logs.&lt;/p&gt;
&lt;p&gt;Seulement voilà, splunk est payant, et même plutot cher si vous souhaitez
l'intégrer dans un environnement de hosting par exemple. Alors le reflexe
habituel quand on est un gros radin comme moi, c'est de trouver une alternative
gratuite, mais jusqu'à présent, c'etait un peu l'age de pierre chez la
concurrence (non je ne citerai personne).&lt;/p&gt;
&lt;p&gt;Jusqu'à present :)&lt;/p&gt;
&lt;p&gt;Tout a fait par hasard, je suis tombe sur un &lt;a href=&quot;http://blog.theroux.ca/syslog/advanced-logging-on-linux/&quot; hreflang=&quot;en&quot;&gt;billet&lt;/a&gt; de ce monsieur en chemise a carreaux (kof). Et la.. ce fut
l'illumination alors je souhaitais -sous la menace- vous faire partager cette
découverte !&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2011/09/16/SPLONK-%21#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2011/09/16/SPLONK-%21#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/637287</wfw:commentRss>
      </item>
    
  <item>
    <title>et dire qu'il y a des gens qui se vantent sans arrêt d'être des &quot;hackers&quot;...</title>
    <link>http://blog.unix4fun.net/post/2011/07/13/et-dire-qu-il-y-a-des-gens-qui-se-vantent-sans-arr%C3%AAt-d-%C3%AAtre-des-%22hackers%22...</link>
    <guid isPermaLink="false">urn:md5:55c6e472e6a157b6764326feb5e1ed04</guid>
    <pubDate>Wed, 13 Jul 2011 01:55:00 +0200</pubDate>
    <dc:creator>eau</dc:creator>
        <category>geeking</category>
        <category>fun</category><category>hack</category><category>hardware</category><category>network</category><category>user</category>    
    <description>    &lt;p&gt;Apprenez l'humilité et un descriptif comme:&lt;br /&gt;
&amp;quot;&lt;strong&gt;(The World's First (and Last?!) IPv6 Cat Feeder!)&lt;/strong&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;Qui est (selon moi) un super joli &amp;quot;hack&amp;quot; d'un mec un peu dingue et super
poilu, en tout cas je trouve ca mortel (et assez incroyable)! congrats! :)&lt;/p&gt;
&lt;p&gt;Enjoy the fun: &lt;a href=&quot;http://www.newtonnet.co.uk/catfeeder/&quot; hreflang=&quot;en&quot;&gt;http://www.newtonnet.co.uk/catfeeder/&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2011/07/13/et-dire-qu-il-y-a-des-gens-qui-se-vantent-sans-arr%C3%AAt-d-%C3%AAtre-des-%22hackers%22...#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2011/07/13/et-dire-qu-il-y-a-des-gens-qui-se-vantent-sans-arr%C3%AAt-d-%C3%AAtre-des-%22hackers%22...#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/622016</wfw:commentRss>
      </item>
    
  <item>
    <title>des piécettes électroniques! donc l'avènement d'e-mendiants!</title>
    <link>http://blog.unix4fun.net/post/2011/06/18/des-pi%C3%A9cettes-%C3%A9lectroniques%21-donc-l-av%C3%A8nement-d-e-mendiants%21</link>
    <guid isPermaLink="false">urn:md5:637ff57bfc2a6e8d64e1c354e6d61ea1</guid>
    <pubDate>Sat, 18 Jun 2011 10:50:00 +0200</pubDate>
    <dc:creator>eau</dc:creator>
        <category>geeking</category>
        <category>analysis</category><category>anonymization</category><category>code</category><category>crypto</category><category>fun</category><category>security</category>    
    <description>    &lt;p&gt;Apres quelques conversations avec un pote sur cette nouvelle &amp;quot;monnaie&amp;quot;
électronique, il m'a fait constater un ensemble de propriétés marrantes et
interessantes (pas de trusted third party, la resolution d'un problème
mathématique pour limiter l'emission de monnaie, etc..), j'ai beaucoup de
lacunes quand au fonctionnement économique actuel, mais le fonctionnement de
cette monnaie et l'utilisation de la crypto et du réseau pour definir ces
propriétés, a lire et suivre!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://en.bitcoin.it/wiki/FAQ&quot; hreflang=&quot;en&quot;&gt;La FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.bitcoin.org/bitcoin.pdf&quot; hreflang=&quot;en&quot;&gt;Le
paper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bitcoin.org/&quot; hreflang=&quot;en&quot;&gt;http://bitcoin.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2011/06/18/des-pi%C3%A9cettes-%C3%A9lectroniques%21-donc-l-av%C3%A8nement-d-e-mendiants%21#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2011/06/18/des-pi%C3%A9cettes-%C3%A9lectroniques%21-donc-l-av%C3%A8nement-d-e-mendiants%21#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/614524</wfw:commentRss>
      </item>
    
  <item>
    <title>La resolution de puzzle...</title>
    <link>http://blog.unix4fun.net/post/2011/06/06/La-resolution-de-puzzle...</link>
    <guid isPermaLink="false">urn:md5:253fb314c5682eb21ba48db2f3b05dc6</guid>
    <pubDate>Mon, 06 Jun 2011 04:11:00 +0200</pubDate>
    <dc:creator>eau</dc:creator>
        <category>geeking</category>
        <category>crypto</category><category>fun</category><category>tips</category>    
    <description>    &lt;p&gt;Le puzzle, oui, je parle bien de ce truc, ou on reconstitue une peinture de
cheval dans un pre ou un voilier sur un soleil couchant.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Je ne sais pas pourquoi, quand je pense puzzle, j'associe les mots bibelot,
kitsch et j'ai l'image testosterone d'un type (sans visage) portant ces
t-shirts tres &amp;quot;male&amp;quot; d'un aigle attaquant un serpent au dessus d'un volcan
flamboyant, l'image ultime de la determination masculine et motorise...
bref...&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Quand on est un déchet de l'informatique moderne comme moi, que la crypto
c'est un peu comme apprendre le thaïlandais avec victor le matin sur france3 et
que malgré tout ces &amp;quot;signes&amp;quot;, on s'acharne a vouloir mal prononcer &amp;quot;bonjour&amp;quot; en
thai, on en arrive a se retrouver face a des puzzles.. effectivement c'est
étrange.. mais il y a parfois des liens marrants a lire sur ces petits
&amp;quot;challenges&amp;quot; qui réclament un cerveau et de la curiosité...&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Hope you enjoy: &lt;a href=&quot;http://www.thephoenixsociety.org/puzzles/puzzlesolving.htm&quot; hreflang=&quot;en&quot;&gt;http://www.thephoenixsociety.org/puzzles/puzzlesolving.htm&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2011/06/06/La-resolution-de-puzzle...#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2011/06/06/La-resolution-de-puzzle...#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/611829</wfw:commentRss>
      </item>
    
  <item>
    <title>c'est quoi SCTP!?</title>
    <link>http://blog.unix4fun.net/post/2011/04/28/c-est-quoi-SCTP%21</link>
    <guid isPermaLink="false">urn:md5:c35edf32348098399fbc25d6ff2c438d</guid>
    <pubDate>Thu, 28 Apr 2011 10:07:00 +0200</pubDate>
    <dc:creator>eau</dc:creator>
        <category>geeking</category>
        <category>doc</category><category>network</category><category>SCTP</category>    
    <description>    &lt;p&gt;Alors je suis en mode honey badger cette semaine et je &amp;quot;dig&amp;quot; pleins de trucs
que je ne connais pas tres bien, je mattais comment marche SCTP, le soit disant
&amp;quot;potentiel remplaçant de TCP et UDP&amp;quot; (oui je vous jure j ai lu ca qqes part,
mais je sais plus ou...).&lt;/p&gt;
&lt;p&gt;Si comme moi vous aviez juste une feuille de platane pour cacher votre
nudité devant SCTP, voila &lt;a href=&quot;http://tdrwww.exp-math.uni-essen.de/inhalt/forschung/sctp_fb/SCTP4Beginners.html&quot; hreflang=&quot;en&quot;&gt;une introduction a SCTP&lt;/a&gt;, de quoi avoir un short en lieu et
place de la feuille de platane.&lt;/p&gt;
&lt;p&gt;Je me demande si TCP/IP illustrated et cie sont mis a jour avec tout ces
nouveaux protocoles, IPv6, SCTP etc... ou si il y a de nouvelles references
aussi détaillées..&lt;/p&gt;
&lt;p&gt;bref enjoy!&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2011/04/28/c-est-quoi-SCTP%21#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2011/04/28/c-est-quoi-SCTP%21#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/604058</wfw:commentRss>
      </item>
    
  <item>
    <title>Ché le printemps Che fais le ménach'</title>
    <link>http://blog.unix4fun.net/post/2011/03/16/Ch%C3%A9-le-printemps-Che-fais-le-m%C3%A9nach</link>
    <guid isPermaLink="false">urn:md5:f50448814909da45ef1dd017d96da162</guid>
    <pubDate>Wed, 16 Mar 2011 18:58:00 +0100</pubDate>
    <dc:creator>eyr</dc:creator>
        <category>geeking</category>
            
    <description>    &lt;p&gt;Ach ja, je suis en pleine immersion Clean-Slate Internet depuis quelques
mois, et je pense qu'il est effectivement plus que temps de réfléchir à comment
faire évoluer Internet avec les nouveaux usages qu'il est en train de se
prendre direct dans la face. Alors si vous vous dites que mais à quoi bon vu
que IPv6 arrive? Eh bien je vous propose de lire cette introduction aux
problèmes sous-jacents sur le blog du laboratoire i2CAT de Barcelone:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://i2catblogctx.wordpress.com/2011/01/10/ready-to-go-ipv6-think-again/&quot; hreflang=&quot;en&quot;&gt;http://i2catblogctx.wordpress.com/2011/01/10/ready-to-go-ipv6-think-again/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pas assez concret? Une douche froide sur socket(2), une:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://i2catblogctx.wordpress.com/2011/02/14/developing-distributed-applications-using-rina/&quot; hreflang=&quot;en&quot;&gt;http://i2catblogctx.wordpress.com/2011/02/14/developing-distributed-applications-using-rina/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alors pour se débarrasser de toutes ces poussières et repartir sur de bonnes
bases, je vous conseille de faire les courses de détergents, serviettes,
éponges, tablier voire acide borique ici:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://pouzin.pnanetworks.com/documentspublications.html&quot; hreflang=&quot;en&quot;&gt;http://pouzin.pnanetworks.com/documentspublications.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Commencez par la fin, il y a même le mode d'emploi. Voila, frottez bien!&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2011/03/16/Ch%C3%A9-le-printemps-Che-fais-le-m%C3%A9nach#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2011/03/16/Ch%C3%A9-le-printemps-Che-fais-le-m%C3%A9nach#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/594901</wfw:commentRss>
      </item>
    
  <item>
    <title>Des hooks sympa de fonctions avec gcc</title>
    <link>http://blog.unix4fun.net/post/2011/02/17/Des-hooks-sympa-de-fonctions-avec-gcc</link>
    <guid isPermaLink="false">urn:md5:f7f46119fbbf9cdc519d509ba7fd7fc2</guid>
    <pubDate>Thu, 17 Feb 2011 13:26:00 +0100</pubDate>
    <dc:creator>poz</dc:creator>
        <category>geeking</category>
        <category>analysis</category><category>C</category><category>code</category><category>fun</category><category>gcc</category><category>tips</category>    
    <description>    &lt;p&gt;Yo yo yo.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;J'avais une base de code, avec pas mal de fonctions déjà implémentées, et
puis je me suis dit &amp;quot;ooooomm, faudrait que je trace le temps d'exécution de
chacune de ces fonctions, pour savoir où concentrer mes efforts, en faisant
telle et telle stat'&amp;quot;. Bon alors je vous entends déjà barir au loin &amp;quot;hey mais
pauvre naze, y'a plein d'outils de profiling&amp;quot;, et c'est vrai. Seulement je
voulais faire un truc à ma sauce d'une part (histoire de voir un peu comment ça
fonctionne), et surtout pouvoir ajouter les stats qui m'intéressent, faire des
trucs aux p'tits oignons quoi. Et puis c'est pas comme si ça prenait des jours
à coder.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Alors après avoir cherché un peu, je tombe sur la doc GCC (même le man en
parle, à vrai dire) :&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
void __cyg_profile_func_enter(void *func, void *callsite); 
void __cyg_profile_func_exit(void *func, void *callsite);
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Ces fonctions sont appelées respectivement à l'entrée et la sortie de
chacune des fonctions de votre programme. Il y a une linuxerie ensuite pour
obtenir le nom de l'appelant, ie. passer par &lt;code&gt;dladdr()&lt;/code&gt; ou
&lt;code&gt;__build_return_address(0)&lt;/code&gt;. Ensuite vous stockez les infos comme
vous voulez, perso j'utilise une hashtable dont les clefs sont les symboles
(aka noms de fonctions), avec chaque cellule contenant des stats, sur le nombre
d'appel, le temps d'exécution moyen, etc.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;J'ai utilisé ça pour un code sur lequel je passe un peu de temps en ce
moment, et la sortie ressemble à (le &amp;gt; correspond à l'entrée dans la
fonction, le &amp;lt; à la sortie, faudrait rendre le truc plus joli avec un
système de pile pour avoir la profondeur d'appel de chacune en fonction d'un
décalage horizontal, mais bon, ça viendra après) :&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
[...]
1297941768.719531 &amp;gt; dfs_mkdir@0x40f534
1297941768.719607 &amp;gt; dfs_mkdir_timeout@0x41398f
1297941769.416415 &amp;lt; dfs_mkdir_timeout@0x41398f -- 696ms
1297941769.416445 &amp;lt; dfs_mkdir@0x40f534 -- 696ms
1297941769.416469 &amp;gt; dfs_getattr@0x40c16c
1297941769.416684 &amp;gt; dfs_namei_timeout@0x413ef7
1297941769.534098 &amp;lt; dfs_namei_timeout@0x413ef7 -- 117ms
1297941769.534161 &amp;gt; dfs_getattr_timeout@0x413690
1297941770.104592 &amp;lt; dfs_getattr_timeout@0x413690 -- 570ms
1297941770.104874 &amp;lt; dfs_getattr@0x40c16c -- 570ms

                                -- report --
symbol dfs_getattr_timeout: #calls: 46, average call duration: 266ms
symbol dfs_opendir_timeout: #calls: 1, average call duration: 780ms
symbol dfs_namei_timeout: #calls: 47, average call duration: 299ms
symbol dfs_chdir_timeout: #calls: 1, average call duration: 0ms
symbol dfs_mkdir: #calls: 1, average call duration: 696ms
symbol dfs_getattr: #calls: 48, average call duration: 275ms
symbol dfs_mkdir_timeout: #calls: 1, average call duration: 696ms
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Le code (crados, pas encore nettoyé) est visible &lt;a href=&quot;https://github.com/pozdnychev/dropletfs-fuse/blob/master/src/profile.c&quot;&gt;ici&lt;/a&gt;.
Comme je disais, le truc vraiment sympa c'est juste d'avoir à appeler
&lt;code&gt;profile_init()&lt;/code&gt; et &lt;code&gt;profile_fini()&lt;/code&gt; dans mon code. Et
encore, on peut faire mieux en générant un .so qu'on charge avec
&lt;code&gt;LD_PRELOAD&lt;/code&gt;, histoire d'avoir vraiment 0 code impacté. Faut juste
compiler les objets avec &lt;code&gt;-fPIC&lt;/code&gt; et
&lt;code&gt;-finstrument-functions&lt;/code&gt;. That's all folks.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;OK c'est un profiler du pauvre, mais ici à unix4fun, on est prolos. Et on
vous emmerde !&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2011/02/17/Des-hooks-sympa-de-fonctions-avec-gcc#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2011/02/17/Des-hooks-sympa-de-fonctions-avec-gcc#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/588339</wfw:commentRss>
      </item>
    
  <item>
    <title>mirrroiiirr, mon bon mirrroir, donne moi la clef de ce routeur!</title>
    <link>http://blog.unix4fun.net/post/2011/02/16/mirrroiiirr%2C-mon-bon-mirrroir%2C-donne-moi-la-clef-de-ce-routeur%21</link>
    <guid isPermaLink="false">urn:md5:44e737f2acc8e812b6e1da745e6866e8</guid>
    <pubDate>Wed, 16 Feb 2011 11:01:00 +0100</pubDate>
    <dc:creator>eau</dc:creator>
        <category>geeking</category>
        <category>analysis</category><category>fun</category><category>hardware</category><category>reverse</category><category>vulnerability</category><category>wireless</category>    
    <description>    &lt;p&gt;Un document marrant, une analyze du recovery des clef WEP qui sont generees
a partir d'un algo &amp;quot;secret&amp;quot; mais en fonction de parametre public comme la
MAC.&lt;/p&gt;
&lt;p&gt;C'est marrant a lire: &lt;a href=&quot;http://websec.ca/blog/view/mac2wepkey_huawei&quot; hreflang=&quot;en&quot;&gt;http://websec.ca/blog/view/mac2wepkey_huawei&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;enjoy!&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2011/02/16/mirrroiiirr%2C-mon-bon-mirrroir%2C-donne-moi-la-clef-de-ce-routeur%21#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2011/02/16/mirrroiiirr%2C-mon-bon-mirrroir%2C-donne-moi-la-clef-de-ce-routeur%21#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/588025</wfw:commentRss>
      </item>
    
  <item>
    <title>Pour les addicts du sniffing réseau: Junkie</title>
    <link>http://blog.unix4fun.net/post/2010/12/21/Pour-les-addicts-du-sniffing-r%C3%A9seau%3A-Junkie</link>
    <guid isPermaLink="false">urn:md5:b1a46d9cb43c25ff40bf4fecfda7550d</guid>
    <pubDate>Tue, 21 Dec 2010 20:51:00 +0100</pubDate>
    <dc:creator>poz</dc:creator>
        <category>geeking</category>
        <category>analysis</category><category>C</category><category>capture</category><category>network</category><category>pcap</category>    
    <description>    &lt;p&gt;Un peu de proselytisme ne fait jamais de mal, alors voilà &lt;a href=&quot;http://github.com/securactive/junkie&quot;&gt;Junkie&lt;/a&gt;, un sniffer releasé en Open
Source par la société SecurActive.&lt;/p&gt;
&lt;p&gt;Pour l'instant il a été programmé pour tourner sur du Linux debian-like,
donc...&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Un extrait du README:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
Compared to previously available tools junkie lies in between tcpdump and
wireshark. Unlike tcpdump, its purpose is to parse protocols of any depth;
unlike wireshark, through, junkie is designed to analyze traffic in real-time
and so cannot parse traffic as completely as wireshark does.

In addition, junkie's design encompasses extendability and speed:

- plug-in system + high-level extension language that eases the development and
  combination of new functionalities;
- threaded packet capture and analysis for handling of high bandwidth network;
- modular architecture to ease the addition of any protocol layer;
- based on libpcap for portability;
- well tested on professional settings.
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
Il manque un &amp;quot;IPv6 compliant&amp;quot; je pense, dans ce README.&lt;/p&gt;
&lt;p&gt;Seuls les parseurs sont releasés en Open Source, mais c'est déjà bien sympa.
Le design est fait de telle sorte qu'il est facile d'ajouter un plugin
d'analyse pour un protocole particulier &lt;a href=&quot;http://blog.unix4fun.net/post/2010/12/21/1&quot; title=&quot;1&quot;&gt;1&lt;/a&gt;. Et pour
ceux qui n'aiment pas le C, il y a possibilité d'exercer vos talents de codeurs
Scheme (guile plus précisemment), car il est scriptable à l'aide de ce
langage ! Ouh ouh !&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Un petit exemple d'utilisation ? OK, c'est parti :&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
$ sudo ./src/junkie -i wlan0 -c config/start-repl.scm
2010-12-22 00:36:45: J-main: log.c/log_set_file: Opening log file.
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;OK, là on lui a dit de loguer sur stdout, d'écouter l'interface wireless
wlan0, et de prendre le fichier de conf par défaut qui active le REPL. Donc,
dans un autre terminal, je vais me connecter sur la machine, en tcp/29000 pour
ajouter des settings sur la mouche comme disent nos amis anglais (ie. &amp;quot;on the
fly&amp;quot;... ok c'est nul).&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
$ rlwrap telnet localhost 29000
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
junkie&amp;gt; (set-iface-filter &amp;quot;wlan0&amp;quot; &amp;quot;icmp&amp;quot;)
#t
junkie&amp;gt; (set-log-level 6)
#&amp;lt;unspecified&amp;gt;
junkie&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
Les valeurs de retour affichées sont celles de guile, à savoir #t pour true, et
#&amp;lt;unspecified&amp;gt; pour dire qu'il n'y a pas de code de retour. C'est un peu
curieux au début, mais ceux qui ont utilisé ce langage ne seront pas
dépaysés.&lt;/p&gt;
&lt;p&gt;Là je lui ai demandé de prendre en compte le filtre BPF (tcpdump, vous
connaissez, hein ?) &amp;quot;icmp&amp;quot; pour l'interface wlan0.&lt;/p&gt;
&lt;p&gt;Hey ouais, c'est ça qui est cool, on peut écouter sur différentes interfaces
avec des filtres différents. Bref, dans un autre terminal je tape :&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
$ ping free.fr -c1
PING free.fr (212.27.48.10) 56(84) bytes of data.
64 bytes from www.free.fr (212.27.48.10): icmp_seq=1 ttl=118 time=37.1 ms

--- free.fr ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 37.176/37.176/37.176/0.000 ms
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Et si on repasse dans la console de log, on a :&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
Capture@0x23f0068: head_len=48, payload=60, dev_id=0, tv=1293009623s 788239us
Ethernet@0x2413ea8: head_len=14, payload=46, vlan_id=0, source=00:1b:2f:2e:e0:fa, dest=ff:ff:ff:ff:ff:ff, proto=2054

Capture@0x23f0068: head_len=48, payload=74, dev_id=0, tv=1293009880s 139307us
Ethernet@0x2413ea8: head_len=14, payload=60, vlan_id=0, source=00:1c:bf:9d:2e:21, dest=00:15:e9:f2:30:67, proto=2048
IPv4@0x2414e38: head_len=20, payload=40, version=4, addr=10.0.63.10-&amp;gt;82.237.175.5, proto=6, ttl=64
TCP@0x23bcf08: head_len=40, payload=0, ports=42007-&amp;gt;1234, flags=Syn, win=5840, ack=0, seq=902941316

Capture@0x23f0068: head_len=48, payload=98, dev_id=0, tv=1293009631s 741103us
Ethernet@0x2413ea8: head_len=14, payload=84, vlan_id=0, source=00:1c:bf:9d:2e:21, dest=00:15:e9:f2:30:67, proto=2048
IPv4@0x2414e38: head_len=20, payload=64, version=4, addr=10.0.63.10-&amp;gt;212.27.48.10, proto=1, ttl=64
ICMP@0x23bb198: head_len=64, payload=0, type=EchoRequest, err=NONE

Capture@0x23f0068: head_len=48, payload=98, dev_id=0, tv=1293009631s 744391us
Ethernet@0x2413ea8: head_len=14, payload=84, vlan_id=0, source=00:15:e9:f2:30:67, dest=00:1c:bf:9d:2e:21, proto=2048
IPv4@0x2414e38: head_len=20, payload=64, version=4, addr=212.27.48.10-&amp;gt;10.0.63.10 (hashed the other way), proto=1, ttl=122
ICMP@0x23bb198: head_len=64, payload=0, type=EchoReply, err=NONE

&lt;/pre&gt;
&lt;p&gt;Un lecteur attentif verra qu'il n'y a pas que de l'ICMP qui a été logué (cf.
les premières lignes). Il a raison ! Mais comme je l'ai dit plus haut, on
a changé la config à chaud, donc Junkie a eu le temps de loguer quelques
paquets avant de prendre en compte le filtre BPF.&lt;/p&gt;
&lt;p&gt;Et voilà ! Bon, c'est un exemple parmi des tonnes hein, chacun peut y
trouver son compte, là c'est vraiment pour expliquer le fonctionnement. Pour
plus d'infos :&lt;/p&gt;
&lt;pre&gt;
$ junkie -h
&lt;/pre&gt;
&lt;p&gt;Ou bien pour des détails vraiment poussés, dans le REPL :&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
junkie&amp;gt; (help)
[...]
junkie&amp;gt; (help 'commande)
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.unix4fun.net/post/2010/12/21/1&quot; title=&quot;1&quot;&gt;1&lt;/a&gt; Tutorial de codage d'un parseur : &lt;a href=&quot;https://github.com/securactive/junkie/wiki/Introduction-to-parser-implementation&quot;&gt;
parser implementation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2010/12/21/Pour-les-addicts-du-sniffing-r%C3%A9seau%3A-Junkie#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2010/12/21/Pour-les-addicts-du-sniffing-r%C3%A9seau%3A-Junkie#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/572713</wfw:commentRss>
      </item>
    
  <item>
    <title>Je ... c'est quoi une LED?</title>
    <link>http://blog.unix4fun.net/post/2010/11/10/Je-ne-...</link>
    <guid isPermaLink="false">urn:md5:30d5c7c90ca564a5da229e04135c2708</guid>
    <pubDate>Wed, 10 Nov 2010 13:08:00 +0100</pubDate>
    <dc:creator>eau</dc:creator>
        <category>geeking</category>
        <category>doc</category><category>electronic</category><category>hardware</category>    
    <description>    &lt;p&gt;Pour ceux qui comme moi, n'ont pas de super pouvoir, ne voit pas la matrice,
ne sont pas comme un type qui a soit-disant ouvert la mer en deux parce que les
ferry étaient en grève et qu'il se faisait courser en sortant de boite avec ses
potes.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Il faut attendre le ferry, il faut apprendre des trucs souvent simples, les
refaire les relire et se rendre compte chaque jour plus on apprends, moins on
en sait.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;En fait, on ne sait RIEN, oui je ne sais RIEN, c'est triste et je prends ma
claque sur la joue chaque jour...&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Bref, j'ai trouve un tutoriel postée sur hack-a-day pour les
débutants-sans-super-pouvoirs-ouvre-la-mer comme moi, qui introduit au concept
simple des LEDs. J'ai bien aimé, alors je partage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ladyada.net/learn/arduino/LEDs.html&quot; hreflang=&quot;en&quot;&gt;http://www.ladyada.net/learn/arduino/LEDs.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2010/11/10/Je-ne-...#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2010/11/10/Je-ne-...#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/560783</wfw:commentRss>
      </item>
    
  <item>
    <title>Mon compilo est un beau salaud!</title>
    <link>http://blog.unix4fun.net/post/2010/11/09/Mon-compilo-est-un-beau-salaud%21</link>
    <guid isPermaLink="false">urn:md5:825f4f8ecc3d7429d6c0335beb32361d</guid>
    <pubDate>Tue, 09 Nov 2010 23:15:00 +0100</pubDate>
    <dc:creator>eau</dc:creator>
        <category>geeking</category>
        <category>asm</category><category>assembly</category><category>behaviour</category><category>code</category><category>compiler</category><category>tips</category>    
    <description>    &lt;p&gt;Je lis du code généré en ce moment... en particulier du code généré par
Visual C++ avec des options &amp;quot;star-wars-security&amp;quot; blablabla mais c'est pas le
sujet du jour...&lt;/p&gt;
&lt;p&gt;Le sujet du jour c'est ma relative incompétence face a des choses comme:&lt;/p&gt;
&lt;pre&gt;
[...]
.text:0069979F mov     eax, 66666667h          
.text:006997A4 imul    ecx
.text:006997A6 sar     edx, 1                          
.text:006997A8 mov    eax, edx                     
.text:006997AA shr     eax, 1Fh                       
.text:006997AD add     eax, edx
[...]
&lt;/pre&gt;
&lt;p&gt;alors dans ecx, j'ai la valeur 0x20000, après des tentatives rapides de
compréhension, je me suis bon les &amp;quot;magic values&amp;quot;, j'en vois de temps en temps,
ca pue la &amp;quot;magic value&amp;quot; des trucs de compilo-salaud pour tenter d'avoir de la
précisions en continuant a travailler avec des entiers et en base2, bref..&lt;/p&gt;
&lt;p&gt;En cherchant un peu je suis tombe la dessus:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.dkbza.org/2007/09/reverse-engineering-compiler-produced.html&quot; hreflang=&quot;en&quot;&gt;http://blog.dkbza.org/2007/09/reverse-engineering-compiler-produced.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et j'ai enfin compris ce que ce petit snippet de code faisait, alors d’après
vous il se passe quoi ? et quel est l’algèbre applique a la valeur dans ecx!?
:) (je mettrais a jour avec une explication si le lien n'est vraiment pas
clair...)&lt;/p&gt;
&lt;p&gt;peace!&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2010/11/09/Mon-compilo-est-un-beau-salaud%21#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2010/11/09/Mon-compilo-est-un-beau-salaud%21#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/560649</wfw:commentRss>
      </item>
    
  <item>
    <title>Le strict aliasing en C</title>
    <link>http://blog.unix4fun.net/post/2010/11/04/Le-strict-aliasing-en-C</link>
    <guid isPermaLink="false">urn:md5:a3f91f0c153109791d1446885533ee19</guid>
    <pubDate>Thu, 04 Nov 2010 16:31:00 +0100</pubDate>
    <dc:creator>poz</dc:creator>
        <category>geeking</category>
        <category>assembly</category><category>C</category><category>code</category><category>compiler</category>    
    <description>    &lt;p&gt;Un billet assez exhaustif, avec des exemples de code et d'output
assembleur : c'est &lt;a href=&quot;http://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html&quot;&gt;
ici&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2010/11/04/Le-strict-aliasing-en-C#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2010/11/04/Le-strict-aliasing-en-C#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/559322</wfw:commentRss>
      </item>
    
  <item>
    <title>Pwnage par libpcap</title>
    <link>http://blog.unix4fun.net/post/2010/10/07/Pwnage-par-libpcap</link>
    <guid isPermaLink="false">urn:md5:50bfcf64edfa014dda4cad60b5c097b9</guid>
    <pubDate>Thu, 07 Oct 2010 15:26:00 +0200</pubDate>
    <dc:creator>poz</dc:creator>
        <category>geeking</category>
        <category>C</category><category>code</category><category>linux</category><category>network</category>    
    <description>    &lt;p&gt;Yo. Dans ce post je vais expliquer comment je me suis battu pour faire un
truc assez simple avec la libpcap sous linux.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Au début était un sniffer, je voulais écouter sur une interface à grands
coups de SOCK_RAW + recvfrom(). À l'ancienne, quoi. L'idée était de ne pas
utiliser de handler pcap (pcap_t *). Au bout d'un moment je me dis &amp;quot;tiens, ça
serait sympa d'ajouter les filtres BPF comme dans tcpdump&amp;quot;. Brillante idée,
non ? Non, ok. Bref, le code de départ est le suivant :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
// -*- c-basic-offset: 4; indent-tabs-mode: nil -*-
// vim:sw=4 ts=4 sts=4 expandtab
#include &amp;lt;limits.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;sys/socket.h&amp;gt;
#include &amp;lt;sys/ioctl.h&amp;gt;
#include &amp;lt;net/if.h&amp;gt;
#include &amp;lt;netinet/in.h&amp;gt;
#include &amp;lt;linux/if_ether.h&amp;gt;
#include &amp;lt;arpa/inet.h&amp;gt;
#include &amp;lt;netpacket/packet.h&amp;gt;
#include &amp;lt;poll.h&amp;gt;
#include &amp;lt;linux/types.h&amp;gt;
#include &amp;lt;errno.h&amp;gt;
#include &amp;lt;pcap.h&amp;gt;
#include &amp;lt;linux/filter.h&amp;gt;

#define FRAME_SIZE 65536

/* iface_setprom() sets &amp;quot;device&amp;quot; in promiscuous mode */
static int
iface_setprom(int sock_fd, const char *device)
{
    struct ifreq ifr;

    memset(&amp;amp;ifr, 0, sizeof ifr);
    snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), &amp;quot;%s&amp;quot;, device);

    if (ioctl(sock_fd, SIOCGIFFLAGS, &amp;amp;ifr) == -1) {
        printf(&amp;quot;[%s] ioctl: %s.\n&amp;quot;, device, strerror(errno));
        return -1;
    }

    ifr.ifr_flags |= (IFF_PROMISC | IFF_UP);

    if (ioctl(sock_fd, SIOCSIFFLAGS, &amp;amp;ifr) == -1) {
        printf(&amp;quot;[%s] ioctl: %s.\n&amp;quot;, device, strerror(errno));
        return -1;
    }

    printf(&amp;quot;[%s] enter in promiscuous mode\n&amp;quot;, device);
    return 0;
}
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;À partir d'une chaîne de caractère entrée, par exemple &amp;quot;tcp and port 22&amp;quot;, on
veut obtenir une structure comprise par pcap_compile*(). Comme dit
précédemment, je ne veux pas de pcap_t* à manipuler, je vais donc utiliser
pcap_compile_nopcap() (non mentionné dans le man de pcap_compile sous linux,
évidemment).&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
/* iface_setfilter() applies a LSF filter to the file descriptor */
static int
iface_setfilter(int sock_fd, const char * const device, const char * const filter)
{
    if (!filter || !*filter) {
        printf(&amp;quot;[%s] no filter to install\n&amp;quot;, device);
        return 0;
    }

    struct bpf_program bpf;
    memset(&amp;amp;bpf, 0, sizeof bpf);

    char errbuf[PCAP_ERRBUF_SIZE = &amp;quot;&amp;quot;;

    if (-1 == pcap_compile_nopcap(FRAME_SIZE, DLT_RAW, &amp;amp;bpf, filter, 1, 0)) {
        printf(&amp;quot;[%s] pcap_compile_nopcap failed for '%s'\n&amp;quot;, device, filter);
        return -1;
    }

    if (-1 == setsockopt(sock_fd, SOL_SOCKET, SO_ATTACH_FILTER, &amp;amp;bpf, sizeof bpf)) {
        printf(&amp;quot;[%s] setsockopt: %s (filter '%s')\n&amp;quot;, device, strerror(errno), filter);
        return -1;
    }

    printf(&amp;quot;[%s] filter '%s' successfully installed\n&amp;quot;, device, filter);
    return 0;
}

/* iface_init() is the main device initialization function */
static int
iface_init(struct pollfd *fds, const char * const device, const char * const filter)
{
    printf(&amp;quot;Initializing interface %s (filter '%s')\n&amp;quot;, device, filter);

    fds-&amp;gt;fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
    if (fds-&amp;gt;fd == -1) {
        printf(&amp;quot;[%s] socket: %s. Exiting...\n&amp;quot;, device, strerror(errno));
        exit(EXIT_FAILURE);
    }

    fds-&amp;gt;events = POLLIN | POLLPRI;

    if (0 != iface_setprom(fds-&amp;gt;fd, device)) return -1;
    if (0 != iface_bind(fds-&amp;gt;fd, device)) return -1;
    if (0 != iface_setfilter(fds-&amp;gt;fd, device, filter)) return -1;

    return 0;
}

static void
frame_manager(const char * const device, struct pollfd *fd, struct timeval const *now)
{
    uint32_t i;

    if ((fd-&amp;gt;revents &amp;amp; (POLLIN | POLLPRI)) == 0)
        return;

    unsigned char buf[1500] = &amp;quot;&amp;quot;;
    ssize_t n = recvfrom(fd-&amp;gt;fd, buf, sizeof buf, MSG_DONTWAIT, NULL, NULL);
    if (n &amp;lt; 0) {
        printf(&amp;quot;[%s] recvfrom: %s (i=%d, fd=%d)\n&amp;quot;, device, strerror(errno), i, fd-&amp;gt;fd);
        return;
    }

    printf(&amp;quot;[%d,%d] packet received\n&amp;quot;, (int)now-&amp;gt;tv_sec, (int)now-&amp;gt;tv_usec);
}

int main(int ac, char **av)
{
    char *filter = &amp;quot;&amp;quot;;
    char *device = &amp;quot;dummy0&amp;quot;;

    if (ac &amp;gt; 1) {
        filter = av[1];
    }

    struct pollfd fd;
    (void)iface_init(&amp;amp;fd, device, filter);

    while (/*CONSTCOND*/ 1) {
        if (poll(&amp;amp;fd, 1, -1) &amp;gt; 0) {
            struct timeval now;
            gettimeofday(&amp;amp;now, NULL);
            frame_manager(device, &amp;amp;fd, &amp;amp;now);
        }
    }

    close(fd.fd);
    return EXIT_SUCCESS;
}
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Tout d'abord, je monte une interface virtuelle pour éviter le bruit généré
par les paquets circulants sur mes vraies interfaces :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
$ sudo modprobe dummy
$ sudo ifconfig dummy0 mtu 1600 up
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Maintenant, si je compile et j'exécute le code, et que je balance du ssh sur
dummy0, j'ai ça :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
$ cc -o cap cap.c -lpcap
$ sudo ./cap &amp;quot;tcp and port 22&amp;quot;
[...]
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Et dans un autre terminal :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
$ sudo tcpreplay -i dummy0 ssh.pcap
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Mais aucun &amp;quot;packet received&amp;quot; ne s'affiche. Damned ! En inspectant un
peu le code, on voit ça :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
    if (-1 == setsockopt(sock_fd, SOL_SOCKET, SO_ATTACH_FILTER, &amp;amp;bpf, sizeof bpf)) {
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Ça a l'air bien comme ça, hein. Malheureusement, le 'struct bpf_program'
n'est pas compris sous linux, qui, ne voulant pas faire comme ses potes *BSD
attend un 'struct sock_fprog *' en avant dernier argument. Bon, ici je me dis
&amp;quot;il doit bien y avoir une fonction qui fait la conversion, cherchons dans le
source de libpcap&amp;quot;. En jetant un coup d'oeil rapide, on tombe sur
ça :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
libpcap-0.9.8/pcap-linux.c:215 static int       fix_program(pcap_t *handle, struct sock_fprog *fcode);
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Je suis content, mais visiblement je dois passer par un pcap_t. Du coup, je
reprends le code en l'adaptant pour taper directement dans la structure interne
du handler pcap, et j'écris la fonction suivante :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
#define SLL_HDR_LEN 16
static int lcc = 0; // linux cooked capture

static int
fix_offset(struct bpf_insn *p)
{
    if (p-&amp;gt;k &amp;gt;= SLL_HDR_LEN) {
        p-&amp;gt;k -= SLL_HDR_LEN;
    } else if (p-&amp;gt;k == 14) {
        p-&amp;gt;k = SKF_AD_OFF + SKF_AD_PROTOCOL;
    } else {
        return -1;
    }
    return 0;
}

static int
fix_code(struct bpf_program *bpf, struct sock_fprog *fcode)
{
    size_t prog_size;
    register int i;
    register struct bpf_insn *p;
    struct bpf_insn *f;
    int len;

    len = bpf-&amp;gt;bf_len;
    prog_size = sizeof(bpf-&amp;gt;bf_insns) * len;
    f = malloc(prog_size);
    if (f == NULL) {
        printf(&amp;quot;malloc: %s\n&amp;quot;, strerror(errno));
        return -1;
    }
    memcpy(f, bpf-&amp;gt;bf_insns, prog_size);
    fcode-&amp;gt;len = len;
    fcode-&amp;gt;filter = (struct sock_filter *)f;

    for (i = 0; i &amp;lt; len; ++i) {
        p = &amp;amp;f[i];
        switch (BPF_CLASS(p-&amp;gt;code)) {

        case BPF_RET:
            if (BPF_MODE(p-&amp;gt;code) == BPF_K) {
                if (p-&amp;gt;k != 0)
                    p-&amp;gt;k = 65535;
            }
            break;

        case BPF_LD:
        case BPF_LDX:
            switch (BPF_MODE(p-&amp;gt;code)) {

            case BPF_ABS:
            case BPF_IND:
            case BPF_MSH:
                if (lcc) {
                    if (fix_offset(p) &amp;lt; 0) {
                        return 0;
                    }
                }
                break;
            }
            break;
        }
    }
    return 1;       /* success! */
}
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Maintenant je réécris ma fonction iface_setfilter() pour convertir le code
BPF :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
static int
iface_setfilter(int sock_fd, const char * const device, const char * const filter)
{
    if (! filter || ! *filter) {
        printf(&amp;quot;[%s] no filter to install\n&amp;quot;, device);
        return 0;
    }

    struct bpf_program bpf;
    memset(&amp;amp;bpf, 0, sizeof bpf);

    if (-1 == pcap_compile_nopcap(FRAME_SIZE, DLT_RAW, &amp;amp;bpf, filter, 1, 0)) {
        printf(&amp;quot;[%s] pcap_compile_nopcap failed for '%s'\n&amp;quot;, device, filter);
        return -1;
    }

    struct sock_fprog fcode;
    memset(&amp;amp;fcode, 0, sizeof fcode);
    int ret = fix_code(&amp;amp;bpf, &amp;amp;fcode);

    if (1 != ret) {
        printf(&amp;quot;[%s] fix_code failed (rcode = %d) for filter '%s'\n&amp;quot;, device, ret, filter);
        return -1;
    } else {
        printf(&amp;quot;[%s] fix_code worked (rcode = %d) for filter '%s'\n&amp;quot;, device, ret, filter);
    }

    if (-1 == setsockopt(sock_fd, SOL_SOCKET, SO_ATTACH_FILTER, &amp;amp;fcode, sizeof fcode)) {
        printf(&amp;quot;[%s] setsockopt: %s (filter '%s')\n&amp;quot;, device, strerror(errno), filter);
        return -1;
    }

    printf(&amp;quot;[%s] filter '%s' successfully installed\n&amp;quot;, device, filter);
    return 0;
}
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Là, logiquement je me dis &amp;quot;Youpi les knakis¸ ça va marcher !&amp;quot;. Mais si je
reteste, toujours rien. Rien ne s'affiche. La blague est même que si
j'invoque :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
$ sudo ./cap &amp;quot;not port 80&amp;quot;
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;... et que je joue du traffic http (sur le port 80 bien sûr), mon outil
logue qu'il a vu un paquet ! Par contre avec &amp;quot;port 80&amp;quot; il n'affiche rien.
Bon je me suis pas mal gratté la tête ici, j'avoue. Du coup j'appelle mon
copain strace à la rescousse, et je compare le raw des filtres passés à
setsockopt() entre mon code et l'appel tcpdump :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
$ sudo strace -s 256 -f -v ./cap &amp;quot;port 80&amp;quot; 2&amp;gt;&amp;amp;1 | grep ATTACH_FILTER
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, &amp;quot;\33\0\0\0\0\0\0\0\20\240\363\0\0\0\0\0&amp;quot;, 16) = 0
^C
$ sudo strace -s 256 -f -v tcpdump -ni dummy0 port 80 2&amp;gt;&amp;amp;1 | grep ATTACH_FILTER
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, &amp;quot;\1\0\0\0\0\0\0\0h\303\315E(\177\0\0&amp;quot;, 16) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, &amp;quot;\30\0\0\0\0\0\0\0\360V1G(\177\0\0&amp;quot;, 16) = 0
^C
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Les outputs ne sont pas les mêmes. La génération du filtre est donc
foireuse, je vérifie maintenant comme suit :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
$ sudo tcpdump -nd port 80
(000) ldh      [12]
(001) jeq      #0x86dd          jt 2    jf 10
(002) ldb      [20]
(003) jeq      #0x84            jt 6    jf 4
(004) jeq      #0x6             jt 6    jf 5
(005) jeq      #0x11            jt 6    jf 23
(006) ldh      [54]
(007) jeq      #0x50            jt 22   jf 8
(008) ldh      [56]
(009) jeq      #0x50            jt 22   jf 23
(010) jeq      #0x800           jt 11   jf 23
(011) ldb      [23]
(012) jeq      #0x84            jt 15   jf 13
(013) jeq      #0x6             jt 15   jf 14
(014) jeq      #0x11            jt 15   jf 23
(015) ldh      [20]
(016) jset     #0x1fff          jt 23   jf 17
(017) ldxb     4*([14]&amp;amp;0xf)
(018) ldh      [x + 14]
(019) jeq      #0x50            jt 22   jf 20
(020) ldh      [x + 16]
(021) jeq      #0x50            jt 22   jf 23
(022) ret      #96
(023) ret      #0
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Et j'invoque&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
    if (-1 == pcap_compile_nopcap(FRAME_SIZE, DLT_RAW, &amp;amp;bpf, filter, 1, 0)) {
        printf(&amp;quot;[%s] pcap_compile_nopcap failed for '%s'\n&amp;quot;, device, filter);
        return -1;
    }
    bpf_dump(&amp;amp;bpf, 0);
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;J'ai en sortie :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
Initializing interface dummy0 (filter 'port 80')
[dummy0] enter in promiscuous mode
[dummy0] bind succeed: index 1634 &amp;lt;--&amp;gt; dummy0
(000) ldb      [0]
(001) and      #0xf0
(002) jeq      #0x60            jt 3    jf 11
(003) ldb      [6]
(004) jeq      #0x84            jt 7    jf 5
(005) jeq      #0x6             jt 7    jf 6
(006) jeq      #0x11            jt 7    jf 26
(007) ldh      [40]
(008) jeq      #0x50            jt 25   jf 9
(009) ldh      [42]
(010) jeq      #0x50            jt 25   jf 26
(011) ldb      [0]
(012) and      #0xf0
(013) jeq      #0x40            jt 14   jf 26
(014) ldb      [9]
(015) jeq      #0x84            jt 18   jf 16
(016) jeq      #0x6             jt 18   jf 17
(017) jeq      #0x11            jt 18   jf 26
(018) ldh      [6]
(019) jset     #0x1fff          jt 26   jf 20
(020) ldxb     4*([0]&amp;amp;0xf)
(021) ldh      [x + 0]
(022) jeq      #0x50            jt 25   jf 23
(023) ldh      [x + 2]
(024) jeq      #0x50            jt 25   jf 26
(025) ret      #65536
(026) ret      #0
[dummy0] fix_code worked (rcode = 1) for filter 'port 80'
[dummy0] filter 'port 80' successfully installed
^C
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;On voit bien que c'est différent au début. Le reste est plutôt
cohérent&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
(016) jeq      #0x6             jt 18   jf 17  # 0x06 c'est l'IPPROTO_TCP (6)
(017) jeq      #0x11            jt 18   jf 26  # 0x11 = 17 = IPPROTO_UDP
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Si on n'est dans aucun des deux cas, on saute en 26 (jf 26), soit la fin.
Sinon, on regarde si le port vaut 80 (0x50) :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
(022) jeq      #0x50            jt 25   jf 23
(023) ldh      [x + 2]
(024) jeq      #0x50            jt 25   jf 26
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Le problème est vraiment le prologue. Et là je on me souffle à l'oreille que
c'est peut-être le datalink type. Réaction: &amp;quot;bon dieu de !#@@!#@!# mais c'est
bien sûr, ça doit être mon datalink (DLT) qui est moisi !&amp;quot; Si
j'écris :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
    if (-1 == pcap_compile_nopcap(FRAME_SIZE, DLT_IEEE802, &amp;amp;bpf, filter, 1, 0)) {
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;J'obtiens en sortie :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
$ cc -o cap cap.c -lpcap &amp;amp;&amp;amp; sudo ./cap &amp;quot;port 80&amp;quot; 
Initializing interface dummy0 (filter 'port 80')
[dummy0] enter in promiscuous mode
[dummy0] bind succeed: index 1634 &amp;lt;--&amp;gt; dummy0
(000) ldh      [20]
(001) jeq      #0x86dd          jt 2    jf 10  # 0x86dd est l'ethertype IPv6
(002) ldb      [28]
(003) jeq      #0x84            jt 6    jf 4
(004) jeq      #0x6             jt 6    jf 5
(005) jeq      #0x11            jt 6    jf 23
(006) ldh      [62]
(007) jeq      #0x50            jt 22   jf 8
(008) ldh      [64]
(009) jeq      #0x50            jt 22   jf 23
(010) jeq      #0x800           jt 11   jf 23  # 0x800 est l'ethertype IPv4
[...]
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Mais toujours rien n'est logué si je joue du http ! En remplaçant
DLT_IEEE802 par DLT_EN10MB en revanche...&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
[...]
[dummy0] enter in promiscuous mode
[dummy0] bind succeed: index 1634 &amp;lt;--&amp;gt; dummy0
[dummy0] fix_code worked (rcode = 1) for filter 'port 80'
[dummy0] filter 'port 80' successfully installed
[1286457559,615193] packet received
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Hallelujah ! Hosanna hosanna !&lt;/p&gt;
&lt;p&gt;Enfin bon, c'est quand même moche d'écrire le DLT en dur dans le code, donc
je l'ai récupéré via la libpcap (mais on est obligé de passer par un handler
pcap_t *, ce que je ne voulais pas trop au début...)&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
    char errbuf[256] = &amp;quot;&amp;quot;;
    pcap_t *p = pcap_open_live(device, FRAME_SIZE, 1, 0, errbuf);
    if (! p) {
        printf(&amp;quot;[%s] pcap_open_live failed: %s\n&amp;quot;, device, errbuf);
        return -1;
    }

    int dlt = pcap_datalink(p);
    pcap_close(p);

    if (-1 == pcap_compile_nopcap(FRAME_SIZE, dlt, &amp;amp;bpf, filter, 1, 0)) {
        printf(&amp;quot;[%s] pcap_compile_nopcap failed for '%s'\n&amp;quot;, device, filter);
        return -1;
    }
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;En fait, comme on dispose du handler pcap_t, on peut même dégager
pcap_compile_nopcap() et utiliser pcap_compile(), qui lui n'a même pas besoin
d'un DLT en paramètre... Tout ça parce que j'ai voulu me passer de ce foutu
handler, en somme. Bref le code est disponible &lt;a href=&quot;http://blog.unix4fun.net/public/src/cap.c&quot;&gt;ici&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2010/10/07/Pwnage-par-libpcap#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2010/10/07/Pwnage-par-libpcap#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/552885</wfw:commentRss>
      </item>
    
  <item>
    <title>GCC ifunc!</title>
    <link>http://blog.unix4fun.net/post/2010/09/15/GCC-ifunc%21</link>
    <guid isPermaLink="false">urn:md5:2959558a348606ab11c5a9aa7b60439d</guid>
    <pubDate>Wed, 15 Sep 2010 10:36:00 +0200</pubDate>
    <dc:creator>eau</dc:creator>
        <category>geeking</category>
        <category>C</category><category>code</category><category>compiler</category>    
    <description>    &lt;p&gt;Pendant ma petite pause lecture du matin, je suis tombé sur ce post
concernant les nouvelles updates de la GNU toolchain, et en particulier un
nouvel attribut: &amp;quot;ifunc&amp;quot;&lt;/p&gt;
&lt;p&gt;Ca permet de définir dynamiquement une fonction qui va &amp;quot;résoudre&amp;quot; vers la
fonction de votre choix en fonction de critères que vous pouvez définir, le
&lt;a href=&quot;http://nickclifton.livejournal.com/6612.html&quot; hreflang=&quot;en&quot;&gt;monsieur @
http://nickclifton.livejournal.com/6612.html&lt;/a&gt; donne un exemple très simple
et très clair (plus clair que mes explications foireuses) que je reproduirais
ici :&lt;/p&gt;
&lt;pre&gt;
void *slow_memcpy (void *dst, const void *src, size_t len)
{
         char *d = dst; char *s = src;

         while (len--)
           *d++ = *s++;

         return dst;
}

void *fast_memcpy (void *dst, const void *src, size_t len)
{
         __asm(&amp;quot;foo %0 %1 %2&amp;quot; : &amp;quot;=m&amp;quot; (dst) :  &amp;quot;m&amp;quot; (src), &amp;quot;r&amp;quot; (len) : memory);
         return dst;
}

static void (* resolve_memcpy (void)) (void)
{
         return __cpu_has_foo () ? fast_memcpy : slow_memcpy;
}

void *memcpy (void *, const void *, size_t) __attribute__ ((ifunc (&amp;quot;resolve_memcpy&amp;quot;)));
&lt;/pre&gt;
&lt;p&gt;Les details chez &lt;a href=&quot;http://nickclifton.livejournal.com/6612.html&quot; hreflang=&quot;en&quot;&gt;http://nickclifton.livejournal.com/6612.html&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2010/09/15/GCC-ifunc%21#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2010/09/15/GCC-ifunc%21#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/546174</wfw:commentRss>
      </item>
    
  <item>
    <title>Du Sprite avec beaucoup de bulles pour ces hacks !</title>
    <link>http://blog.unix4fun.net/post/2010/08/30/Du-Sprite-avec-beaucoup-de-bulles-pour-ces-hacks-%21</link>
    <guid isPermaLink="false">urn:md5:9ceb961b2bf3b0c45755d148a8b31368</guid>
    <pubDate>Mon, 30 Aug 2010 17:49:00 +0000</pubDate>
    <dc:creator>camoroz0</dc:creator>
        <category>geeking</category>
            
    <description>    &lt;p&gt;L'autre jour, quand j'étais en train d'enregistrer tout l'internet sur un
DVD, je suis tombé sur le blog de &amp;quot;sprites&amp;quot;: &lt;a href=&quot;http://spritesmods.com/&quot;&gt;http://spritesmods.com/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En voilà de beaux projets, je reste épaté, ou &amp;quot;maravilhado&amp;quot; pour les plus
portugais d'entre nous. Sprites a attaqué plusieurs systèmes embarqués qui
offrent une certaine sécurité: Biostick, Secustick, y'a rien à dire, c'est
fantastick I&lt;/p&gt;
&lt;p&gt;Tout ça me fait aussi penser que une firme Suisse, Victorinox offre plein
d'argent si vous &lt;a href=&quot;http://secure.victorinox.com/Products/VictorinoxSecure/tabid/73/language/en-US/Default.aspx&quot; hreflang=&quot;en&quot;&gt;arrivez à péter la rondelle à leur clé USB&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2010/08/30/Du-Sprite-avec-beaucoup-de-bulles-pour-ces-hacks-%21#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2010/08/30/Du-Sprite-avec-beaucoup-de-bulles-pour-ces-hacks-%21#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/542793</wfw:commentRss>
      </item>
    
  <item>
    <title>si toi aussi tu aimes le poulet routi!</title>
    <link>http://blog.unix4fun.net/post/2010/08/16/si-toi-aussi-tu-aimes-le-poulet-routi%21</link>
    <guid isPermaLink="false">urn:md5:e63eec308a062e39c64a4aae0ebb546a</guid>
    <pubDate>Mon, 16 Aug 2010 17:29:00 +0200</pubDate>
    <dc:creator>eau</dc:creator>
        <category>geeking</category>
        <category>ARM</category><category>asm</category><category>assembly</category><category>code</category><category>fun</category><category>tips</category>    
    <description>    &lt;p&gt;Je suis une grosse feignasse et je lis pas énormément de code, en ce moment
je lis des trucs fait sur de l'ARM. En bonne grosse tanche, je n'avais jamais
vu ces CMP suivi d'un CMPNE et d'un BXX ou un MOVXX etc.. (c'est en mode ARM
only) ailleurs:&lt;/p&gt;
&lt;pre&gt;
CMP      R1,#1 
CMPNE    R2,#2 
BEQ      bleh 
&lt;/pre&gt;
&lt;p&gt;Heureusement qu'il y a l'internet poilu pour éclairer et donner des belles
recettes.&lt;/p&gt;
&lt;p&gt;J'ai trouve des gens qui parlent de comment on fait un &lt;a href=&quot;http://groups.google.com/group/comp.sys.acorn.programmer/browse_thread/thread/76ffaddaf9ca1dbb&quot; hreflang=&quot;en&quot;&gt;poulet roti&lt;/a&gt; et comment voir si il est bien cuit!&lt;/p&gt;
&lt;p&gt;Apparemment tu peux chainer des conditions tranquillement avec un petit
&amp;quot;suffix&amp;quot; dans l'instruction (il y a des bits réservés dans l'instruction pour
ces options ARM-only)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://simplemachines.it/doc/arm_inst.pdf&quot; hreflang=&quot;en&quot;&gt;ARM
specs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;voila ca m'a rendu service aujourd'hui enjoy!&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.unix4fun.net/post/2010/08/16/si-toi-aussi-tu-aimes-le-poulet-routi%21#comment-form</comments>
      <wfw:comment>http://blog.unix4fun.net/post/2010/08/16/si-toi-aussi-tu-aimes-le-poulet-routi%21#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.unix4fun.net/feed/atom/comments/539899</wfw:commentRss>
      </item>
    
</channel>
</rss>
