2010-12-08 4 views
-2

J'ai besoin de savoir comment je retire le null (00) du code machine. J'ai écrit le code en langage d'assemblage. Il fonctionne avec succès. J'ai besoin de la sortie sans NULLComment faire pour supprimer NULL (00) de code machine?

.data 
    Bash: 
     .asciz "/bin/hostname" 
    Null1: 
     .int 0 
    AddrToBash: 
     .int 0 
    NULL2: 
     .int 0 

    .text 
     .globl _start 

_start: 
     #execute routine 

     xor %eax,%eax 
     movl $Bash, AddrToBash 
     movl $11,%eax 
     movl $Bash,%ebx 
     movl $AddrToBash,%ecx 
     movl $NULL2,%edx 
     int $0x80 

     #exit routine 


    Exit: 
     movl $10,%ebx 
     movl $1,%eax 
     int $0x80 

La sortie suivante est

4000b0: 31 c0     xor %eax,%eax 
    4000b2: c7 04 25 f2 00 60 00 movl $0x6000e0,0x6000f2 
    4000b9: e0 00 60 00 
    4000bd: b8 0b 00 00 00   mov $0xb,%eax 
    4000c2: bb e0 00 60 00   mov $0x6000e0,%ebx 
    4000c7: b9 f2 00 60 00   mov $0x6000f2,%ecx 
    4000cc: ba f6 00 60 00   mov $0x6000f6,%edx 
    4000d1: cd 80     int $0x80 

00000000004000d3 <Exit>: 
    4000d3: bb 0a 00 00 00   mov $0xa,%ebx 
    4000d8: b8 01 00 00 00   mov $0x1,%eax 
    4000dd: cd 80     int $0x80 

comment enlever 00, je ne l'a changé comme eax à al, bx à bl blahahahahahaha ...... mais ne fonctionne pas quelqu'un peut-il le modifier .......

+0

Veuillez corriger la démarque de votre publication. –

+10

Je ne comprendrai jamais pourquoi les gens trouvent qu'il est si difficile de cliquer sur le bouton magique "code de format". Ou même pourquoi les gens ne * regardent pas l'aperçu * et réalisent que la moitié de leur code ** n'est même pas affichée à cause d'un mauvais formatage **. Si vous ne pouvez pas prendre la peine de regarder votre ** propre ** question, pourquoi vous attendez-vous à ce que quelqu'un d'autre le lise? – jalf

+1

Et que voulez-vous dire "sans nul"? Quel null voulez-vous supprimer, et * pourquoi *? – jalf

Répondre

0

Donc, vous voulez utiliser des opcodes qui ne contiennent pas d'octet 0. Cela pourrait être utile uniquement pour créer des débordements de buffer avec des chaînes (exemple: strcpy()). Soit vous apprenez l'assemblage très bien, de sorte que vous connaissiez le codage binaire des instructions les plus courantes par cœur, évitant ainsi 0. Ou en utilisant des outils existants pour cela: quelque chose qui code le code original en une représentation sans 0 octet (exemple: BCD, base64, ou même chaîne ASCII comme 010010010), et lui ajoute un décripteur spécial qui ne contient pas de zéros.

+0

THanks pour répondre ..... J'ai besoin d'imprimer le nom d'hôte en utilisant le calll du système execv en langage assembleur. Le système d'exploitation est FreeBSD. après la compilation et l'exécution du code je vais obtenir l'opcode .... Mais l'opcode ne doit pas contenir 00 paire ... mais je ne sais pas comment faire ça – Neefra

3

Vous devez prendre beaucoup de choses en considération si vous voulez éviter les octets NULL dans le shellcode. Cependant, la plupart du temps, il s'agit de remplacer les instructions par des instructions équivalentes.

Par exemple,

mov $0, %eax 

produit b8 00 00 00 00 qui contient octets NULL. Le remplacer par

xor %eax, %eax 

est sémantiquement équivalent mais produit 31 c0 à la place.

Pour une bonne introduction à l'écriture de shellcode, lire Smashing The Stack For Fun And Profit. Le livre Hacking: The Art of Exploitation contient une section (0x523) sur l'évitement des octets NULL dans le shellcode.

Questions connexes