Asm / desasm

Bonsoir à tous!!!
Est-ce que vous allez bien ce soir???

Voila, je cherche à comprendre un code source en assembleur mais j’avoue que j’ai quelques difficultés.

[code];pyrofreak.asm
[SECTION .text]

global _start

_start:

    jmp short ender

    starter:

    xor eax, eax    ;clean up the registers
    xor ebx, ebx
    xor edx, edx
    xor ecx, ecx

    mov al, 4       ;syscall write
    mov bl, 1       ;stdout is 1
    pop ecx         ;get the address of the string from the stack
    mov dl, 26       ;length of the string
    int 0x80

    xor eax, eax
    mov al, 1       ;exit the shellcode
    xor ebx,ebx
    int 0x80

    ender:
    call starter    ;put the address of the string on the stack
    db 'hello world '[/code]Il est censé affiché hello world mais a chaque fois que je test j'obtiens un segfault.

2 questions :

  1. Le sources n’etant pas de moi serait il possible que l’on puisse me donner quelques infos dessus.
  2. Il y a t il une erreur dans ce code source qui me fasse ce segfault ou est ce a cause de ma compilation???

utilises un outil genre ddd (apt-cache search debugger) pour executer ton binaire instruction par instruction.
Par ailleurs, si tu t’amuses avec de l’execution fine, tu peux aussi t’interesser aux fichier “core”. Par défaut, la production de core est désactivée, et je crois que tu peux la reactiver avec ulimit. ‘man ulimit’ est d’ailleurs un bon point de départ pour lire, en suivant les ‘SEE ALSO’ (chez moi, la page n’est pas traduite).
Je rappelle qu’un fichier core est une l’emprunte du processus en mêmoire (plus précisément le BCP), et que tu peux donc voir l’état des registres, etc…

Le core produit par le segfault est alors utilisable pour observer l’état au moment du plantage avec ddd.

PS: pour le problême qui te préoccupe, je ne suis pas trés fort en assembleur, et surtout sur le fonctionnement le plus intime de l’OS, mais il me semble bizarre sur une machine avec un coeur en “logique C” d’obtenir la longueur d’une chaine en une seule instruction:

mov dl, 26 ;length of the string .
je verrais plutôt un “syscall strlen”, si ça existe, ou un jmp sur une sub strlen.
Mais je ne suis pas sur que les chaines systême ne contiennent pas leur propre longueur, c’est juste une intuition.
U C what I mean ?

Merci bien pour tes réponses :slightly_smiling:
ddd est juste en fait une interface graphique à gdb d’après le peu que j’ai pu voir (bien pratique d’ailleurs, je suis encore à le faire en mode console :slightly_smiling:). Je vais tester tout ça.

oui je vois à peu près ce que tu dit ayant quelques connaissances en C. L’intérêt de ce programme est très restreint. Mais, il est vrai aussi qu’il faut coder correctement des le départ pour ne pas prendre de mauvaise habitude.
Je vais essayer de me faire un petit prog en asm avec le peu de doc que j’ai pour voir si je n’arrive pas à mieux comprendre car pour le moment même avec les commentaires j’ai un quelques difficultés de compréhension.

;pyrofreak.asm
[SECTION .text]

global _start


_start:

        jmp short ender

        starter:

        xor eax, eax    ; met a 0 eax
        xor ebx, ebx   ;  met a 0 ebx
        xor edx, edx   ;  met a 0 edx
        xor ecx, ecx   ;  met a 0 ecx

        mov al, 4       ;syscall write
        mov bl, 1       ;stdout is 1
        pop ecx         ;get the address of the string from the stack
        mov dl, 26    ;length of the string
        int 0x80        ; appel system execution

        xor eax, eax ; remet eax a 0
        mov al, 1       ; exit the shellcode
        xor ebx,ebx   ; remet ebx a 0
        int 0x80         ; appel system execution

        ender:
        call starter    ; put the address of the string on the stack
        db 'hello world '

chez moi ca fonctionne.

$nasm -f elf test.asm
$ld -s test.o -o test
$./test
hello world The Netwide Astonfi@localhost$

Vous n’avez pas peur de faire planter votre ordi? La programmation assembleur, c’est dangereux vous savez…

slt,

Qui te dit qu’on tourne sur le system en lui meme, peut etre que j’utilise uml…:slightly_smiling:

Je doit donc soit avoir quelque chose de plus soit quelque chose qui me manque pour que ca fonctionne correctement.

je viens de retester encore chez moi et encore un segfault

[code]ash@seal:~$ nasm -f elf test.asm
ash@seal:~$ ld -s test.o -o test
ash@seal:~$ ./test
Erreur de segmentation
ash@seal:~$ objdump -d test

test: format de fichier elf32-i386

Déassemblage de la section .text:

08048080 <.text>:
8048080: eb 19 jmp 0x804809b
8048082: 31 c0 xor %eax,%eax
8048084: 31 db xor %ebx,%ebx
8048086: 31 d2 xor %edx,%edx
8048088: 31 c9 xor %ecx,%ecx
804808a: b0 04 mov $0x4,%al
804808c: b3 01 mov $0x1,%bl
804808e: 59 pop %ecx
804808f: b2 1a mov $0x1a,%dl
8048091: cd 80 int $0x80
8048093: 31 c0 xor %eax,%eax
8048095: b0 01 mov $0x1,%al
8048097: 31 db xor %ebx,%ebx
8048099: cd 80 int $0x80
804809b: e8 e2 ff ff ff call 0x8048082
80480a0: 68 65 6c 6c 6f push $0x6f6c6c65
80480a5: 20 77 6f and %dh,0x6f(%edi)
80480a8: 72 6c jb 0x8048116
80480aa: 64 fs
80480ab: 20 .byte 0x20

ash@seal:~$
[/code]Je pense que ca doit venir du link avec les librairies mais je ne vois pas du tout comment le résoudre :confused:

[quote]Vous n’avez pas peur de faire planter votre ordi? La programmation assembleur, c’est dangereux vous savez…[/quote]Même pas peur moi, je suis completement cinglé :slightly_smiling:

avec gdb.

'fin moi ce que j’en dis, c’est pour votre bien hein… :laughing:
quoi, c’est pas bien les langages de programmation?

mais l’assembleur EST un language de programmation :laughing:

par ailleurs, linux (UNIX en fait) ne donne accès à la mêmoire réelle qu’au noyau, et donc à part en faisant un appel noyau idiot ou faisant appel à une fonctionnalité buguée, tu prends peu de risque de provoquer un “plantage” direct de ta machine au sens ou ça arrive sous windows: c’est l’executable qui plante, pas linux.
Alors ça n’empêche pas par exemple des mauvaises libérations de ressources, ou d’autres scories qui peuvent provoquer des plantages ailleurs, mais fondamentalement, la programmation sous linux est bien moins dangereuse pour l’OS que sous windows.

J’ajouterais qu’un programme en C est capable de faire tout ce que l’assembleur peut faire, et donc planter aussi bien ta machine :laughing:

C’est possible, j’avoue que mes surprises en Assembleur étaient sur plateforme Winnn…
peut-être que ça vaut le coup que je m’y remette sous Linux.

Non, ça n’a rien de dangeureux, TOUT tes programmes que tu utilise, y compris du javascript, finissent a un moment ou un autre par être du code assembleur hein (par interpretation successives).

Et tout les programmes écrits en C sur ta machine sont TRADUITS en assembleur, qui lui meme est tranduit en code machine binaire, compréhensible par ton processeur.

La programmation assembleur, ça n’a rien de plus dangeureux que de faire du C ou du php !

Pour le segfault, c’est un peu normal

        call starter    ; put the address of the string on the stack
        db 'hello world '

=> la taille de la string ici, c’est 12 bytes

or

        mov dl, 26    ;length of the string

avec un

        mov dl, 12

ça devrais aller mieux :stuck_out_tongue:

Ash, t’entends ça ??

Ben ouais, la longueur de string était fausse malheureusement ca ne fonctionne pas plus.

Je débute dans la prog asm je ne connais donc pas toutes les subtilités et je me demande bien ce qui peut faire planter un programme aussi simple. Il n’y a rien de particulier pourtant.??

La programmation asm fait toujours peur au début mais une fois qu’on s’y met on s’apercois que ce n’est pas si mechant que ca meme si j’ai quand meme du mal :slightly_smiling:

Pour en revenir au probleme principale meme avec la valeur a 26 stonfi a reussi a le compiler et le lancer correctement je ne vois donc pas pourquoi ca ne pourrais pas passer chez moi???

ash: tu as quoi comme processeur ?

amd 2000+ palomino 1.6ghz

cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 6 model : 6 model name : AMD Athlon(tm) XP 2000+ stepping : 2 cpu MHz : 1662.153 cache size : 256 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse pni syscall mmxext 3dnowext 3dnow bogomips : 3293.18

NASM version 0.98.38 compiled on May 17 2005

bon, ben c’est pas un bug de 64bits…
et ton noyau, c’est un SMP ou pas ?
sinon, tu n’as toujours pas débugué en pas à pas ?