Cross compilation avec un raspberry pi

raspberry-ban

Qu’est ce qu’un cross compiler?

Un cross compiler est une chaîne de compilation qui tourne sur une architecture mais qui génère un exécutable binaire pour une autre plate forme.

Avec notre raspberry pi, s’il est assez simple de compiler un code de petite taille,il devient très difficile de compiler de gros programmes.

Enfin, il est beaucoup plus agréable de compiler sur votre machine de guerre vos fichiers en une fraction de seconde que d’attendre une minute entre chaque retouche du code compilé par le petit processeur du raspeberry pi.

NOTE : Afin de fonctionner correctement, il est nécessaire d’utiliser une distribution utilisant le hard-float ABI. Ceci est le cas de la raspian et de la dernière version de d’arch pour le raspberry.

Le jeu d’instruction

Chaque processeur utilise son propre jeu d’instructions. Celui ci correspond au jeu d’instructions assembleur. Ce jeu d’instructions est dépendant de l’architecture du microprocesseur. Il dépend directement de la manière dont sont gravé les circuits en silicium.
L’article suivant en anglais explique le fonctionnement des portes logiques que l’on peut trouver dans un microcprocesseur : Article

247x180xQuiz-Silicon-ARM-247x180.jpg.pagespeed.ic.0dZq6IhOZ8

Le jeu d’instructions supporté par les pc et qui est bien connu des reverser est le x86 qui correspond aux architectures Intel. Pour les AMD, c’est assez simple, c’est le même jeu d’instructions. Donc lorsqu’un code, par exemple du C, est compilé pour votre PC, il génère un assembleur x86 qui correspond à des instructions propres aux processeurs Intel et AMD.
Le problème c’est que le processeur présent sur le raspberry pi est un processeur ARM : 700 MHz ARM11 ARM1176JZF-S

Nous allons donc utiliser une chaîne de compilation qui générera un binaire pour le ARM1176JZF-S. Pour cela nous allons utiliser l’outil crosstool-ng.

Installation de crosstool-ng

Crosstool-ng est un outil permettant de construire des chaînes de compilation pour des plate-formes données.
Pour installer crosstool :

$ wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.17.0.tar.bz2
$ tar xjf crosstool-ng-1.17.0.tar.bz2
$ cd crosstool-ng-1.17.0/
$ sudo ./configure --prefix=/opt/crosstool
$ make
$ sudo make install

J’ai du installer quelques programmes supplémentaires. Le script configuré indique ce qu’il manque. Dans tous les cas, n’hésitez pas à poster dans les commentaires si vous avez besoin de plus d’informations.

Réaliser la chaîne de compilation pour le raspberry pi

Il va falloir créer un répertoire dans lequel crosstool-ng va enregistrer votre chaîne de configuration.

  • Créer un répertoire pour héberger votre chaîne de compilation
  • Lancer /opt/crosstool/bin/ct-ng menuconfig

Le menu suivant apparaît:
menuconfig

  • Dans Path and misc options cocher Try features marked as EXPERIMENTAL (touche Y)
  • Toujours dans Path and misc options Changer Shell to use as CONFIG SHELL et choisir sh
  • Revenir au menu principal et sélectionner Target options
    • Target architecture : ARM
    • Endianess : little endian
    • Bitness : 32 bits
  • Revenir au menu principal et sélectionner Operating system
  • Choisir Target OS linux
  • Revenir au menu principal et sélectionner Binary utilities
  • Changer binutils version pour la 2.21.1a
  • Revenir au menu principal et sélectionner C compiler
  • Cocher Show Linaro versions (EXPERIMENTAL) (touche Y)
  • Choisir linaro-4.6-2012.04 (EXPERIMENTAL)
  • Quitter et sauvegarder les changements

Cross compilons

La compilation s’effectue alors de la manière suivante :

$ ~/x-tools/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc helloWorld.c -o helloWord
$ ls
helloWord  helloWorld.c
$ scp helloWorld pi@192.168.1.107:helloWorld
pi@192.168.1.107's password: 
helloWord                                     100% 4985     4.9KB/s   00:00

On l’execute maintenant sur le raspeberry pi :

$ ssh pi@192.168.1.107
pi@192.168.1.107's password: 
Linux raspberrypi 3.2.27+ #250 PREEMPT Thu Oct 18 19:03:02 BST 2012 armv6l
 
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
 
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Jan 13 13:33:49 2013 from 192.168.1.100
pi@raspberrypi ~ $ ./helloWorld 
Oversimple says hello!

Conclusion

On remarque qu’il est relativement difficile de monter une chaîne de compilation pour un processeur ARM et surtout assez long. La réalisation de la chaîne à pris presque une heure chez moi. Cependant, il devient très vite quasi indispensable de le faire si vous souhaitez développer sur le raspberry.
La conception et la compilation de gros projets devient donc plus simple. A titre d’information, les kernels que l’on récupère sur le site du projet raspberry sont compilé de cette manière.

Source :
helloWorld.c

Eclipse et le plugin git (egit) pour Linux et Windows

Dans les articles précédents je vous avais parlé de git et afin de le securiser avec gitolite.

Installation du plugin EGIT

Si on désire utiliser git avec eclipse, il nous faut le plugin EGIT présent ici : Site d’information sur egit

Si on regarde sur ce site, on peut avoir le répertoire afin de télécharger egit via Eclipse :
On ajoute le lien puis on sélectionne EGIT (http://download.eclipse.org/egit/updates).


On clique sur suivant et on lance l’installation.
Une fois l’installation terminée, on rédémarre et nous voila avec le plugin EGIT.

Configuration du plugin

La configuration du fichier pour ssh est utile uniquement si vous souhaitez avec votre clé privée (notamment pour utiliser avec gitolite)

Pour rappel des articles précédents, j’ai configuré dans mon fichier de configuration ssh (~/.ssh/config) de la manière suivante :

host gitolite
    user git 
    hostname monServeur
    port 22
    identityfile ~/.ssh/pierre

Pour Windows, c’est le même principe dans mon cas : C:\Users\pierre\.ssh (pierre étant mon utilisateur)

De plus, On peut aussi configurer le fichier .gitconfig (windows : C:\Users\pierre\.gitconfig, linux : ~/.gitconfig) :

$ cat ~/.gitconfig
[color]
        diff = auto
        status = auto
        branch = auto
[user]
        name = Pierre
        email = pierre@oversimple.fr

Plus d’informations sur les configurations ssh et gitconfig dans la catégorie git ici

Importer un projet

Importons un projet GIT avec notre plugin EGIT.

Pour cela File > Import > Projects from Git :

On sélectionne URI car notre répertoire est distant.

Explication de la configuration :
URI : On ne saisit rien par défaut.
Host : On saisit gitolite car cela fait référence à ma configuration du .ssh/config
Repository path : le nom de notre répertoire sur git.
Protocol SSH.

De cette manière la ligne est automatiquement créée pour le champ URI.

Après on choisit la branche sur lequel on doit travailler. Dans mon cas je n’ai qu’une branche Master. Je clique sur Next, afin de configurer mon répertoire Local.

Maintenant au travail…

De cette manière, nous avons les outils nécessaires pour travailler en équipe lorsque l’on fait un clic droit sur notre projet où un fichier de notre projet on obtient Team.

Voici les informations disponibles :

It’s oversimple isn’t it?

Raspberry Pi : Installation Archlinux sur carte SD 16GO


Installation d’Archlinux sur Carte SD 16 Go pour un Raspberry Pi Modèle B.

Télechargement de la derniere version de archlinux ARM, sur le site de Raspberry Pi : http://www.raspberrypi.org/downloads

Actuellement la dernière version est celle datant du 18 Septembre 2012 :

$ wget http://files.velocix.com/c1410/images/archlinuxarm/archlinux-hf-2012-09-18/archlinux-hf-2012-09-18.zip

On vérifie l’intégrité (toujours utile) :

$ sha1sum archlinux-hf-2012-09-18.zip
56e043f3c629f6c408759bcc157d2d635ce0b6af  archlinux-hf-2012-09-18.zip

On extrait notre archive zip :

 unzip archlinux-hf-2012-09-18.zip

On met en place notre Carte SD, pour connaitre quel périphérique est utilisé on fait un petit « dmesg »

$ dmesg
...(extrait)...
[ 6685.088186] scsi 7:0:0:0: Direct-Access     Multiple Card  Reader     1.00 PQ: 0 ANSI: 0
[ 6685.826912] sd 7:0:0:0: [sdb] 31504384 512-byte logical blocks: (16.1 GB/15.0 GiB)
[ 6685.828905] sd 7:0:0:0: [sdb] Write Protect is off
[ 6685.828911] sd 7:0:0:0: [sdb] Mode Sense: 03 00 00 00
[ 6685.830904] sd 7:0:0:0: [sdb] No Caching mode page present
[ 6685.830910] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[ 6685.836904] sd 7:0:0:0: [sdb] No Caching mode page present
[ 6685.836910] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[ 6685.838290]  sdb: sdb1 sdb2
[ 6685.843910] sd 7:0:0:0: [sdb] No Caching mode page present
[ 6685.843917] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[ 6685.843921] sd 7:0:0:0: [sdb] Attached SCSI removable disk

on voit que notre carte SD correspond, au device /dev/sdb

On pose notre systeme :

$ sudo dd if=archlinux-hf-2012-09-18.img of=/dev/sdb bs=1M
1886+0 records in
1886+0 records out
1977614336 bytes (2.0 GB) copied, 168.367 s, 11.7 MB/s

On place notre carte dans le raspberry, on branche écran hdmi/clavier usb OU le cable ethernet, on boot et on peut se connecter en ssh sur notre raspberry 😉 (root/root)
Pour connaître notre ip, si on a pas d’écran HDMI (ou d’apdateur HDMI, VGA/DVI) : nmap -sn 192.168.1.0/24

$ nmap 192.168.1.0/24
 
Nmap scan report for 192.168.1.16
Host is up (0.040s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh

On se connecte :

ssh root@192.168.1.16

Maintenant, on partitionne les 16 GO sur la Carte SD

# fdisk /dev/mmcblk0

On regarde les partitions avec la commande p :

Command (m for help): p
Disk /dev/mmcblk0: 16.1 GB, 16130244608 bytes
4 heads, 16 sectors/track, 492256 cylinders, total 31504384 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c21e5
 
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1   *        2048      194559       96256    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          194560     3862527     1833984   83  Linux

On supprime la partition 2 afin de la refaire pour nos 16GO, il est possible si vous le désirez de partionner d’une autre manière mais cela reste le même principe

Command (m for help): d  
Partition number (1-4): 2
Partition 2 is deleted

On peut vérifier le résultat :

Command (m for help): p  
Disk /dev/mmcblk0: 16.1 GB, 16130244608 bytes
4 heads, 16 sectors/track, 492256 cylinders, total 31504384 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c21e5
 
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1   *        2048      194559       96256    c  W95 FAT32 (LBA)

On crée une nouvelle partition avec les mêmes infos seul le last sector change.

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (194560-31504383, default 194560): 
Using default value 194560
Last sector, +sectors or +size{K,M,G} (194560-31504383, default 31504383): 
Using default value 31504383
Partition 2 of type Linux and of size 15 GiB is set

On enregistre avec la commande w

Command (m for help): w
The partition table has been altered!
 
Calling ioctl() to re-read partition table.
 
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

On redémarre.

Le travail n’est pas terminé, il faut l’appliquer pour le filesystem.

Pour cela on resize, c’est assez long.

# resize2fs /dev/mmcblk0p2 
resize2fs 1.42.5 (29-Jul-2012)
Filesystem at /dev/mmcblk0p2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/mmcblk0p2 to 3913728 (4k) blocks.

Et après, c’est terminé ! On reboot notre système et voila 🙂

Après un petit redémarrage on peut faire les mises à jour, ainsi que changer le nom de la machine.

Pour les mises à jour :

# pacman -Suy

On modifie notre nom de machine.

vi /etc/hostname

Et si vous désirez installer des packages qui ne sont pas présents dans le mirror list pour ARM mais présent sur les dépôts pour x86 et x86_64 :
On récupère un package, on modifie son PKGBUILD de manière à remplacer les architectures existantes par la notre : uname -m
Et après c’est la routine : makepkg –asroot PKGBUILD et voilà
Après on installe notre archive. Dans mon cas, cela a été nécessaire lors de l’installation du package dsniff.

It’s OverSimple, isn’t it ?

Halloween Tricks [English Version]

 

 

 

We like pumpkin and for halloween we decide to create with our raspberry pi a motion sensor.

How it’s works ?

The idea is simple, when somebody is in the piece, the lamp is putted on.

Discover Raspberry pi

First step, we install a debian on ourraspberry pi.

Second step, we need to start a lamp with the gpio of the raspberry pi.
GPIO are input output spindle, we can have a high voltage (3.3 V) or low voltage ( 0V ).

We can see on the following picture, how to are the GPIO dispatched.

The first thing we do was to put on a LED. This was done by simply connecting a LED to the GPIO 17 and a resistor in serie.


We define the gpio 17 and we use this as an output :

echo "17" /sys/class/gpio/export
echo "out" /sys/class/gpio/gpio17/direction

And to enable the led, we put the voltage high :

echo "1" /sys/class/gpio/gpio17/value

Note : to put off the led we simply replace « 1 » by « 0 »

Create a motion sensor with a webcam

In practice, we could use a infrared motion sensor. However we only  have a webcam, and it’s more challenging with a webcam.

The code is available in the archive.

int main(int argc, char **argv) {
 
	// Initialization GPIO 17
 
	// Image
	IplImage *image1=NULL;
	IplImage *image2=NULL;
	IplImage *subImage=NULL;
 
	// Capture movie
	CvCapture *capture;
 
	// Open the webcam with the number of the device (/dev/videoX for X the number)
	capture = cvCreateCameraCapture(atoi(argv[1]));
 
	//Configure the resolution for the webcam
	cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 640);
	cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);
	cvSetCaptureProperty(capture, CV_CAP_PROP_BRIGHTNESS, 0.65);
 
	// Check if capture is ok
	if (!capture) {
		printf("Ouverture du flux vidéo impossible !\n");
		return 1;
	}
 
	printf("Enjoy !");
 
	// We start our lamp 2 time for check and give the signal
 
	while(1) {
		// Screen first picture
		image1 = cvQueryFrame(capture);
 
		// Waiting 50 milisecondes
		cvWaitKey(50);
 
		// Save image 1
		cvSaveImage("buffer1.jpg",image1,0);
 
		// Screen second picture
		image2 = cvQueryFrame(capture);
 
		// Save image2
		cvSaveImage("buffer2.jpg",image2,0);
 
		// We save both picture
		image1 = cvLoadImage("buffer1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
		image2 = cvLoadImage("buffer2.jpg", CV_LOAD_IMAGE_GRAYSCALE);
 
		// We substract image1 and image2
		subImage = substract(image1, image2);
 
		// We count the number pixel difference of the image 1 and image 2.
		int trigger = count(subImage);
 
		// We compare with our TRIGGER, if we detect mouvement
		if(trigger > TRIGGER) {	
			// if more pixel modify we start the lamp
		}
	}
 
	// Free capture
	cvReleaseCapture(&capture);
 
	return 0;
}

Assembly

Ok, now the program works but we have a problem with GPIO . to put on our lamp we need 5V. For this reason we use a relay in 5V.

However, the raspberry pi ‘GPIO can only provide 3.3V. We need to amplify the signal.

We use the output 5V of the raspberry and an audio amplify (LM386) in non inverting scheme.

We can see the assembly :

Final result


OVERSIMPLE : Halloween détecteur de mouvement par oversimple

Source

Site officiel d’OpenCV

GPIO Raspberry Pi

Codes : complete source code

It’s Oversimple isn’t it?

Réalisation d’un hotspot wifi

Cette article s’adresse à tous ceux qui ont déjà eu envie de se faire un réseau public et au amateur de spoofing.
Le problème des réseaux wifi public et qu’ils sont publics. L’authentification via un navigateur est trop facilement usurpable. Nous ne souhaitions pas réaliser un man in the middle qui a déjà été vu des centaines de fois sur la toile. Nous avons décider de nous plonger d’avantage et de proposer une solution qui reste légale puisqu’elle se contente d’imiter un réseau public. Nous l’appellerons « Noob Wifi ».

Afin de réaliser notre réseau nous avons utilisé la suite aircrack. La suite aircrack propose le module airbase. Celui ci permet de réaliser un réseau wifi ouvert. Il va alors diffuser les beacon frame. Ce sont les paquets contenant le nom du réseau (Free Wifi, Neuf Wifi, SFR Wifi, etc…). Ce qui nous intéresse dans le cadre de la sécurité c’est que si deux réseau avec le même ESSID (le même nom), le client se connectera automatiquement au plus puissant des deux.

Pour réaliser une attaque de type mitm ou bien spoofer le réseau tel que nous souhaitons le faire, il peut dont être intéressant de se procurer une antenne suffisamment puissante pour rayonner d’avantage que le hotspot que l’ont cherche à usurper.

Revenons à nos moutons. Après avoir installer la suite aircrack (ou bien à partir d’une backtrack).

Passage en mode monitoring :

$ airmon-zc start wlan0

Après cela, il va nous falloir configurer la fréquence d’émission de la carte. Pour cela il est nécessaire de sélectionner le chanel. Toute les cartes wifi ne sont pas compatible avec tout les chanels
Configuration du chanel de la carte :

$ iwconfig wlan0 channel 6
$ iwconfig wlan0 channel 6
$ ifconfig wlan0 up
$ ifconfig mon0 up

Lancement du point d’accès :

$ airbase-ng -c 6 --essid "Noob Wifi" mon0 &

Ceci nous permet alors de nous connecter librement à un hotspot. L’association sera faite et la partie protocole wifi est pleinement fonctionnel. Cependant, au même titre qu’une box adsl, airbase ressort une interface ethernet. Celle ci est virtuelle et s’appelle at0. Afin d’obtenir le point d’accès wifi pour relier tout vos équipement à internet par exemple, il vous suffit alors de réaliser une conection de pont entre votre interface web et at0.

Nous utiliserons at0 pour spoofer les requêtes dns et un par feu iptables pour rediriger le client fonction de s’il s’est authentifier auprès de nous ou non!

It’s oversimple, isn’t it?

Et si on sauvegardait notre base de données ?

Avoir un site web c’est bien, mais en faire des sauvegardes ça peut toujours être utile. L’objectif de cet article est de vous montrer comment on sauvegarde notre base de données. Le principe de cette sauvegarde est simple. Ovh éxecute un script que l’on aura stocké sur notre espace personnel. Ce script sauvegardera notre base de données et on obtiendra un fichier SQL contenant notre BDD. Ensuite, un autre script, qui se trouve sur mon serveur personnel, se connectera afin d’aller chercher cette sauvegarde. Vous allez me dire, pourquoi c’est mon serveur qui se connecte au serveur Oversimple ? Tout simplement car je considère que mon serveur est « fiable » contrairement à un serveur mutualisé d’OVH.

Script PHP sur serveur OVH.

<?php
#php doit être supérieur à 5.1

$user="login";
$password="mot de passe";
$nom_de_la_base="baseName";
$serveur_sql="le serveur";
 
#Recupération de la date du jour : JJ-MM-AAAA 
$dateArchive =  date("d-m-Y");
 
#Sauvegarde de la base -> sortie vers un fichier sql -> overSimple-DD-MM-YYYY.sql
system("mysqldump --host=$serveur_sql --user=$user --password=$password $nom_de_la_base > overSimple-$dateArchive.sql");
 
#Récupération de la date a moins 28 jours afin de viser une ancienne archive
$newDate = strtotime('-28 day', strtotime ($dateArchive) );
$newDate = date('d-m-Y', $newDate);
 
#Verification si l'archive existe, on la supprime afin de ne pas en avoir de trop
if(file_exists("overSimple-$newDate.sql")){
	unlink("overSimple-$newDate.sql");
}
 
?>

Script Shell sur mon serveur personnel

#!/bin/sh
 
HOST='le ftp'
PORT='21'
USER='le login'
PASSWORD='un mot de passe ;)'
 
DATE=`date +%d-%m-%Y`
NAME_FILE=overSimple-$DATE.sql
 
#On va dans le repertoire de sauvegarde
cd `dirname $0`
ftp -n $HOST $PORT <<END
quote USER $USER
quote PASS $PASSWORD
cd sauvegarde/
get $NAME_FILE
quit
END
 
#On vérifie si on a télècharger le fichier.
if [ ! -f $NAME_FILE ]
then
    echo "Le fichier n'existe pas !, on le reprogramme pour dans 2 heures"
    echo sh $0 | at now + 2 hours
fi
 
exit

On plannifie l’execute sur OVH

Tous les lundis à 1h du matin. (Hébergement -> Planificateur de tâches)

On planifie sur le serveur

Pour cela rien de bien compliqué, une petite tache cron chaque lundi à 2h du matin (on a de la marge) :

$ crontab -e
00 02 * * 1 /home/overSimple/sauvegarde/sauvegarde.sh
 
On quitte (:wq) et on obtient :
crontab: installing new crontab

Et voilà, on obtient une petite sauvegarde hebdomadaire !