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

x86 32-bits / 64-bits Assembleur Discussion :

Mettre une valeur dans un registre


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #21
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 397
    Points : 424
    Points
    424
    Par défaut
    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
     
    			 \` / /-
    		       \  |  |	 <- There is smoke !
    			| | '|-	    Too many byte is the little house's chimney !
    			 | '| |-	:(
    			| `|''- 
    			- `-'
    			 |''
    [esp+52]	push	0
    [esp+48]	push	'.'
    [esp+44]	push	'irie'
    [esp+40]	push	' pra'
    [esp+36]	push	's la'
    [esp+32]	push	' dan'
    [esp+28]	push	'ison'
    [esp+24]	push	'e Ma'
    [esp+20]	push	'etit'
    [esp+16]	push	'La p'	 ;<- addr début chaîne = sommet pile au moment du push = esp
    		mov	eax,esp  ;<- sauvegarde addr dans eax
     
    [esp+12]	push	10
    [esp+8]		push	'%s'	 ;<- addr début form = sommet pile au moment du push = esp
    		mov	ecx,esp  ;<- sauvegarde addr dans ecx
     
    [esp+4]		push	eax	 ;<- push addr chaîne	 = 2ème arg
    [esp]		push	ecx	 ;<- push addr formatage = 1er arg
     
    		call	[printf] ;<- appel de printf qui cherchera le 1er argument
    				 ;   puis vérifiera combien cet argument contient
    				 ;   de formatage ex (%s %s %x) = 3 arguments après
    				 ;   celui du formatage.
    				 ;   Dans notre cas, printf verra qu'il n'y a qu'un
    				 ;   seul formatage et donc qu'un argument venant 
    				 ;   après lui.
    Les valeurs de la pile à gauche sont celles qu'elle aura lors du dernier push (push ecx).

    Voilà.. Je peux pas être plus clair.
    Après si tu ne comprends pas met ça de côté et reviens-y plus tard.
    a+

  2. #22
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 397
    Points : 424
    Points
    424
    Par défaut
    Citation Envoyé par n5Rzn1D9dC Voir le message
    Moi perso il y a toujours son histoire de 0x1 = 0x10000000 que je trouve extrêmement étrange.

    Normalement, freebsd x86 = linux x68 = windows x86 = little endian = byte arrivant à droite.
    Et je trouve encore plus étrange que personne d'autre ne réagisse à ça : (
    Si c'est bien comme il le dit, c'est à dire les bytes arrivant à gauche, alors normalement c'est qu'il n'est pas sous x86.
    C'est le faite que personne ne d'autre ne réagisse qui me fait légèrement douter.
    Je vais peut être installer Freebsd tout à l'heure pour vérifier parce que je n'aime pas rester dans le doute : /

    edit:
    Aller hop je l'installe.
    J'avais déjà téléchargé DragonFly pour l'installer, mais tant pis, je vais mettre Freebsd en premier.

  3. #23
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par n5Rzn1D9dC Voir le message
    Et je trouve encore plus étrange que personne d'autre ne réagisse à ça : (
    Surtout que 0x10000000 en little ou big endian, ça fait 0x10, pas 0x01.

    Si c'est bien comme il le dit, c'est à dire les bytes arrivant à gauche, alors normalement c'est qu'il n'est pas sous x86.
    Dans tous les cas, ça ne devrait pas être visible au niveau du code assembleur. Le compilateur va les ranger dans l'ordre en fonction de son architecture-cible.

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 397
    Points : 424
    Points
    424
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Surtout que 0x10000000 en little ou big endian, ça fait 0x10, pas 0x01.
    Yep je n'ai pas fait attention (mais bon tout le monde avait compris que c'est ce que je voulais dire).

    Citation Envoyé par Obsidian Voir le message
    Dans tous les cas, ça ne devrait pas être visible au niveau du code assembleur. Le compilateur va les ranger dans l'ordre en fonction de son architecture-cible.
    Je vous dirais ça tout à l'heure. Je l'ai installé là.
    Je compte tester avec un printf, via '%08x', comme je lui avais dit de faire.

  5. #25
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Citation Envoyé par n5Rzn1D9dC Voir le message
    Et je trouve encore plus étrange que personne d'autre ne réagisse à ça : (
    Pour ma part j'ai pas réagi vu que je n'ai jamais pu tester donc oui je suis d'accord mais je peux pas en dire plus.

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 397
    Points : 424
    Points
    424
    Par défaut
    Jsuis en train de l'installer. Pas juste pour vérifier, mais parce que ça fait longtemps que je veux tester bsd.
    Par contre un peu galère avec Vbox, problème de module donc obligé de passer du temps sur ça.

    a+

  7. #27
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 397
    Points : 424
    Points
    424
    Par défaut
    Par contre je me rappel que quand j'ai codé les headers de mon code tcpip, j'avais regardé les fichiers d'entêtes ip et tcp de ma distrie (Linux), et dans ces mêmes headers, il y avait "bsd flavor", où les bytes étaient en gros boutisme..
    C'est aussi ça que je capte pas.
    A moins qu'ils aient forcé le gros boutisme spécialement pour ça.
    En tout cas j'avais trouvé ça vraiment pratique, aucune rotation à faire, les bytes pouvaient arriver tel quel dans les headers ip et tcp.

    edit:
    Non finalement je crois me souvenir que ce n'était pas toutes les valeurs, juste certaines.

  8. #28
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 397
    Points : 424
    Points
    424
    Par défaut
    Bon voilà c'est terminé.
    Pas terrible sous Vbox, de plus pas de partage réseau.
    Il y a des différences notables avec Linux, donc tu as peut être aussi un problème à ce niveau.
    Voilà comment il faut faire un syscall:

    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
     
    format ELF
    include 'include/ccall.inc'
     
    section '.text' executable
     
     public main
     extrn printf
     
     main:
     
    	push	5		;byte nbr
    	push	string		;string addr
    	push	1		;stdout
    	mov	eax,0x4		;write syscall
    	call	kernel		;bsd convention
    	add	esp,12		;stack fix
     
    	ret
     
     
     kernel:
    	int	0x80		;the syscall
    	ret
     
    section '.data' writeable
     
    string db 'plop',10,0
    Il y a d'autres méthodes. Tout est expliqué ici:
    http://www.freebsd.org/doc/en/books/...tem-calls.html

    Et il s'agit bien de petit boutisme.
    J'ai vérifié en faisant un dump de mov eax,0x4 qui donne cet opcode:

    Que ce soit sous Linux, Windows ou Freebsd (x86).

    Par contre j'ai encore un peu de mal à capter cette histoire de boutisme. A savoir si en faisant un printf %08x de 0x1, le printf afficherait le contenue du registre sous sa forme de boutisme, où n'en tiendrait pas compte. J'imagine que non en fin de compte, comme tu disais au niveau de l'arrangement automatique par l'assembleur.
    Bref, c'est bon ça me soule cette histoire de boutisme ^

    edit:
    En faite non, il n'en tiendrait pas compte c'est logique, printf n'affiche que des valeurs et non des opcodes. Ca n'aurait aucun sens.
    Idem pour mov eax,0x1, en gros boutisme, il y aura également 0x01 dans al et non à eax+4.
    En faite en s'en fou du boutisme ^

  9. #29
    Membre régulier

    Homme Profil pro
    Étudiant Réseaux et Télécoms
    Inscrit en
    Octobre 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant Réseaux et Télécoms
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 121
    Points : 92
    Points
    92
    Par défaut
    Hey all!

    Bon je viens de réussir J'étais tellement dépité que j'ai ouvert le livre du cours, et tout était expliqué...

    Donc, en faite, il fallait mettre le numéro de la fonction a appellé avec syscall dans le registre... al!!!!!!!!!!

    En tout cas, merci pour votre aide! Je posterai mon code demain ou après-demain

    J'ai passé trop de temps à suivre des tuto pour linux...

    PS : J'arrive donc à lancer un shell grâce à un bufferoverflow (grâce à excve + syscall)

  10. #30
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 397
    Points : 424
    Points
    424
    Par défaut
    Citation Envoyé par TWEESTY Voir le message
    Hey all!

    Bon je viens de réussir J'étais tellement dépité que j'ai ouvert le livre du cours, et tout était expliqué...

    Donc, en faite, il fallait mettre le numéro de la fonction a appellé avec syscall dans le registre... al!!!!!!!!!!
    Non..
    SI tu mets le numéro du syscall dans le registre al, ça fonctionnera au pifomètre et tu as toutes les chances de crasher ton programme, car si eax contient déjà une valeur, comme par exemple 0xFFFFFFFF, après avoir mis ton syscall dans al (0x4 pour write), eax contiendra cette valeur:

    0xFFFFFF04

    Et tu obtiendras un jolie:
    "Bad system call (core dumped)"

    La solution pour les syscalls, je te l'ai donné dans mon dernier post. Solution officiel du site Freebsd, alors je ne vois pas pourquoi tu vas chercher des réponses dans des cours qui apparemment sont soit faux, mal compris, ou inadaptés.

    La solution pour les shellcodes, je t'en ai donné deux.

    Enfin bref, bonne continuation.

Discussions similaires

  1. mettre une valeur dans une combobox
    Par lila23 dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 06/07/2009, 17h51
  2. Mettre une Valeur dans un OptionBouton quand un autre OB est activé?
    Par muska78 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/06/2008, 10h51
  3. Mettre une valeur dans un Set<? extends String>
    Par LGnord dans le forum Langage
    Réponses: 6
    Dernier message: 06/05/2008, 14h56
  4. Lire et créer une valeur dans le registre
    Par bilal_inf dans le forum Langage
    Réponses: 3
    Dernier message: 11/05/2007, 18h11
  5. Lire une valeur dans le registre
    Par John.s dans le forum C
    Réponses: 2
    Dernier message: 26/11/2003, 19h55

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