Création des shellcodes sous architecture Linux x86 32 bits.

Documents pareils
Structure d un programme

Architecture des ordinateurs

Logiciel de base. Première année ENSIMAG

Les techniques de protection du logiciel

Programmation assembleur : aperçu

Outils pour la pratique

Les failles Format String

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

Cours Langage C/C++ Programmation modulaire

Programmation système I Les entrées/sorties

Rappels Entrées -Sorties

SSTIC Désobfuscation automatique de binaires. Alexandre Gazet. Yoann Guillot. Et autres idyles bucoliques...

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Algorithmique et Programmation, IMA

Rappels d architecture

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Initiation à la sécurité

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Cours 6 : Tubes anonymes et nommés

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Les vulnérabilités du noyau. LECORNET Olivier LEGROS Bruno VIGIER Nicolas Promo 2005

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Architecture des ordinateurs. Loïc Cuvillon. 20 novembre 2013

Playing with ptrace() for fun and profit

Introduction au langage C

Bases de programmation. Cours 5. Structurer les données

Département informatique de l université d Angers

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Les débordements de tampons et les vulnérabilités de chaîne de format 1

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Conventions d écriture et outils de mise au point

Compression de Données - Algorithme de Huffman Document de Conception

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

LEs processus coopèrent souvent pour traiter un même problème. Ces

Compilation (INF 564)

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE


Les chaînes de caractères

IRL : Simulation distribuée pour les systèmes embarqués

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Programmation système en C/C++

Résumé Génération de code Le code intermédiaire

Plan du cours. Historique du langage Nouveautés de Java 7

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

Architecture des ordinateurs : Programmation des processeurs avec l'environnement «y86» (INF155)

GESTION DES FICHIERS C/UNIX

Java et les bases de données

Informatique Générale

Le langage C. Séance n 4

Chapitre 10 : Logiciels

Le prototype de la fonction main()

Concept de machine virtuelle

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Reproductibilité des expériences de l article "Analyse et réduction du chemin critique dans l exécution d une application"

Mesure de performances. [Architecture des ordinateurs, Hennessy & Patterson, 1996]

Cours Programmation Système

I. Introduction aux fonctions : les fonctions standards

Chap III : Les tableaux

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Programmation système de commandes en C

Atelier C TIA Portal CTIA04 : Programmation des automates S7-300 Opérations numériques

1) Installation de Dev-C++ Téléchargez le fichier devcpp4990setup.exe dans un répertoire de votre PC, puis double-cliquez dessus :

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Écrit par Riphur Riphur.net

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Les structures. Chapitre 3

Une introduction à Java

Logiciel Libre Cours 2 Fondements: Programmation

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

PROJET ALGORITHMIQUE ET PROGRAMMATION II

V- Manipulations de nombres en binaire

Testez votre installation. Créer un répertoire vide

ACTIVITÉ DE PROGRAMMATION

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server

Chapitre 1 I:\ Soyez courageux!

Arguments d un programme

Le Network File System de Sun (NFS)

Programmation en langage C

Désobfuscation automatique de binaire - The Barbarian Sublimation

GlobalScape Secure FTP Server Buffer Overflow

Le Projet BINSEC. Automatiser l analyse de sécurité au niveau binaire. Airbus group, CEA, IRISA, LORIA, Uni. Joseph Fourier. p.

Architecture des ordinateurs

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Quelques éléments de compilation en C et makefiles

Débogage de code* Mardi 13 décembre Romaric DAVID Université de Strasbourg - Direction Informatique Pôle HPC. hpc.unistra.

Programmation C++ (débutant)/instructions for, while et do...while

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Programmation Internet en Java

NanoSense. Protocole Modbus de la sonde Particules P4000. (Version 01F)

Serveur Linux : FTP. Mise en place d un service FTP sous Linux. Bouron Dimitri 20/04/2014

Analyse de sécurité de logiciels système par typage statique

Traduction des Langages : Le Compilateur Micro Java

BTS IRIS Cours et Travaux Pratiques. Programmation C. A. Lebret, TSIRIS, Lycée Diderot, 1995/06. en conformité avec le référentiel du BTS IRIS

Définition 0,752 = 0,7 + 0,05 + 0,002 SYSTÈMES DE NUMÉRATION POSITIONNELS =

Transcription:

------------------------------------------------------------------------------------------------------------------------ Création des shellcodes sous architecture Linux x86 32 bits. Jonathan Salwan # http://www.shell storm.org # 04/07/2009 # Bon! on va tout d'abord commencer par les bases de l'asm x86. Il faut savoir que chaque syscall (appel système) est fourni par le noyau du système d'exploitation. Exemple d'appel système fréquemment utilisé: open, write, read, close, chmod, chown... Chaque appel système est défini par un nombre bien précis. Exemple: open => 5 write => 4 chmod => 15 Comment faire pour connaître ce numero? Démonstration: root@laptop:/root# cat /usr/include/asm/unistd_32.h grep write #define NR_write 4 #define NR_writev 146 #define NR_pwrite64 181 root@laptop:/root# cat /usr/include/asm/unistd_32.h grep chmod #define NR_chmod 15 #define NR_fchmod 94 #define NR_fchmodat 306

A quoi va servir notre numero? Lors de la programmation en asm, on va appeler notre syscall via son numero défini. Premier petit programme en asm pour débuter doucement. Réferons nous au site suivant: http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html On va programmer en premier lieu un code qui va tout simplement effectuer une pause. sur le site que je vous est "linker" en regardant le syscall pause (sys_pause) on voit bien qu'on n'a pas besoin de remplir les registres (ebx,ecx,edx...) du coup notre code va être très court! (Attention dans ce tutorial tous les codes asm seront compilés avec NASM version 2.03.01) root@laptop:/home/jonathan/all/prog/asm/pause# section.text global _main _main: mov eax,29 int 0x80 Tout d'abord on attribue le syscall 29 au registre eax (l'appel système de pause) L'instruction int 0x80 nous permet d'exécuter le tout compilons et exécutons notre programme. root@laptop:/home/jonathan/all/prog/asm/pause# nasm f elf main.s root@laptop:/home/jonathan/all/prog/asm/pause# ld o main main.o ld: warning: cannot find entry symbol _start; defaulting to 0000000008048060 root@laptop:/home/jonathan/all/prog/asm/pause#./main ^C root@laptop:/home/jonathan/all/prog/asm/pause# Notre programme fonctionne parfaitement =)(Ctrl+C permet de quitter la pause ;))

Maintenant nous allons étudier l'appel système _exit. Regardons quel est le numero du syscall exit sys_exit = 1 %ebx = int ici _exit aura besoin du registre ebx pour y contenir un entier Nous allons donc essayer de faire l'équivalent de exit(0); root@laptop:/home/jonathan/all/prog/asm/exit# section.text global _main _main: mov eax,1 ; <====== on place 1 dans eax soit le syscall _exit xor ebx,ebx <====== on fait un ou exclusif sur ebx pour avoir 0 (je vous expliquerais plus bas) int 0x80 compilons et exécutons root@laptop:/home/jonathan/all/prog/asm/exit# nasm f elf main.s root@laptop:/home/jonathan/all/prog/asm/exit# ld o main main.o ld: warning: cannot find entry symbol _start; defaulting to 0000000008048060 root@laptop:/home/jonathan/all/prog/asm/exit#./main root@laptop:/home/jonathan/all/prog/asm/exit# Voila tout a bien fonctionné. Maintenant utilisons le programme objdump, objdump va nous permettre d'avoir les valeurs des instructions asm en hexadecimal ce qui va nous servir pour coder notre futur shellcode. root@laptop:/home/jonathan/all/prog/asm/exit# objdump d main main: file format elf32 i386 Disassembly of section.text: 08048060 <_main>: 8048060: b8 01 00 00 00 mov $0x1,%eax 8048065: 31 db xor %ebx,%ebx 8048067: cd 80 int $0x80

Tout à droite nous retrouvons nos instructions en asm, au milieu nous avons leur équivalence en hexadecimal et à gauche nous avons l'adresse des instructions dans notre programme. Pour effectuer un shellcode nous devons avoir aucun 00 sinon notre shellcode marquerait la fin de la chaîne de caractère représentée par celui ci. Info registre eax: Nous devons donc modifier notre code asm, et remplacer le registre eax par al pour que 8 bits soit simplement utilisé au lieu de 32. root@laptop:/home/jonathan/all/prog/asm/exit# section.text global _main _main: mov al,1 <== ici le changement al au lieu de eax xor ebx,ebx <== ou exclusif pour eviter les zéros int 0x80 Vérifions le changement. root@laptop:/home/jonathan/all/prog/asm/exit# objdump d main main: file format elf32 i386 Disassembly of section.text: 08048060 <_main>: 8048060: b0 01 mov $0x1,%al 8048062: 31 db xor %ebx,%ebx 8048064: cd 80 int $0x80 et voilà notre programme ne contient désormais aucun zéro.

Etudions la fonction write. Par contre cette fois nous allons compiler notre programme avec as et non nasm par conséquence la syntaxe de notre programme va légèrement changer... Info write: sys_write = 4 %ebx = unsigned int %ecx = const char * %edx = size Nous allons écrire jona than :p, tout d'abord nous devons couper le mot tous les 32 bits donc 4 caractères, ensuite nous devons écrire tout à l'envers car dans la pile on empile ;) vous devez vous dire que c'est galère mais c'est pas si compliquer que ça regardez le schéma suivant. jonathan => jona than => than => naht => 6e 61 68 74 => jona => anoj => 61 6e 6f 6a root@laptop:/home/jonathan/all/prog/asm/write/2# xor %eax,%eax ; eax à zéro xor %ebx,%ebx ; ebx à zéro xor %edx,%edx xor %ecx,%ecx ; edx à zéro ; ecx à zéro ; on fait tout ça pour éviter ; l'erreur de segment après compilation movb $0x4,%al ; syscall _write movb $0x1,%bl ; unisgned int pushl $0x0a ; line feed (retour à la ligne) push $0x6e616874 ; naht push $0x616e6f6a ; anoj movl %esp,%ecx ; on place esp dans ecx movb $0x9,%dl ; size (ici la taille du mot jonathan + \n ; soit 8 + 1 = 9) int $0x80 movb $0x1,%al ; syscall _exit xor %ebx,%ebx ; ou exclusif pour éviter les zéros int $0x80

Compilons et exécutons tout ça. root@laptop:/home/jonathan/all/prog/asm/write/2# as o main.o main.s root@laptop:/home/jonathan/all/prog/asm/write/2# ld o main main.o ld: warning: cannot find entry symbol _start; defaulting to 0000000008048054 root@laptop:/home/jonathan/all/prog/asm/write/2#./main jonathan root@laptop:/home/jonathan/all/prog/asm/write/2# Maintenant on va voir ce que ça donne pour créer un shellcode en C. Utilisons objdump pour commencer. root@laptop:/home/jonathan/all/prog/asm/write/2# objdump d main main: file format elf32 i386 Disassembly of section.text: 08048054 <.text>: 8048054: 31 c0 xor %eax,%eax 8048056: 31 db xor %ebx,%ebx 8048058: 31 d2 xor %edx,%edx 804805a: 31 c9 xor %ecx,%ecx 804805c: b0 04 mov $0x4,%al 804805e: b3 01 mov $0x1,%bl 8048060: 6a 0a push $0xa 8048062: 68 74 68 61 6e push $0x6e616874 8048067: 68 6a 6f 6e 61 push $0x616e6f6a 804806c: 89 e1 mov %esp,%ecx 804806e: b2 09 mov $0x9,%dl 8048070: cd 80 int $0x80 8048072: b0 01 mov $0x1,%al 8048074: 31 db xor %ebx,%ebx 8048076: cd 80 int $0x80 Cool nous n'avons pas de zéro =) Voyons ce que cela donne en C. : root@laptop:/home/oxosyscall/all/prog/asm/write/2/c# cat main.c #include "stdio.h" int main() { char shellcode[] = "\x31\xc0" "\x31\xdb" "\x31\xd2" "\x31\xc9" "\xb0\x04" "\xb3\x01" "\x6a\x0a" "\x68\x74\x68\x61\x6e" "\x68\x6a\x6f\x6e\x61" "\x89\xe1" "\xb2\x09" "\xcd\x80"

"\xb0\x01" "\x31\xdb" "\xcd\x80"; printf("length: %d\n",strlen(shellcode)); //pour afficher la taille //du shellcode (*(void(*)()) shellcode)(); //asm("jmp %esp"); (autre façon d'exécuter notre shellcode) return 0; } Aller hop! compilons notre first shellcode =) root@laptop:/home/jonathan/all/prog/asm/write/2/c# gcc o main main.c main.c: In function "main": main.c:22: attention : incompatible implicit declaration of built in function "strlen" root@laptop:/home/jonathan/all/prog/asm/write/2/c#./main Length: 36 jonathan Super!!! notre premier shellcode à fonctionné nickel sans aucun problème =) avec une taille de 36 bytes. Si vous voulez d'autres exemples de shellcodes ou documents, vous pouvez vous connecter au site http://www.shell storm.org, vous pouvez également nous envoyer vos sources à l'adresse submit[at]shell storm.org Jonathan Salwan # http://www.shell storm.org #