11
votes

Code auto-modificateur Toujours les défauts de segmentation sur Linux

J'ai trouvé un article sur le code auto-modificateur et j'ai essayé de faire quelques exemples, mais je reçois toujours des défauts de segmentation. En tant que FAS que je peux comprendre, il y a une violation des autorisations de mémoire. Le segment de code est (R) EAD / E (X) écute et donc la tentative d'écriture des résultats à cette faute. Existe-t-il un moyen de tester le programme en modifiant les autorisations de mémoire au moment de l'exécution ou en avant? J'utilise Linux et l'exemple est écrit dans l'assemblage de gaz.

.extern memcpy
.section .data
string:
        .asciz  "Giorgos"
string_end:
.section .bss
        .lcomm buf, string_end-string
.section .text
.globl main
main:
        lea (main), %esi                # get the start of memory region to
                                        # change its permissions (smc-enabled)
        andl $0xFFFFF000, %esi          # align to start of a pagesize
        pushl   $7                      # permissions==r|w|x
        pushl   $4096                   # page size
        pushl   %esi                    # computed start address
        call    mprotect

        call    changer                 # function that does smc
        mov     $string, %edx
label:
        push    string_end-string       # this code will be overridden
        push    $buf                    # and never be executed!
        push    $string
        call    memcpy
changer:
        mov     $offset_to_write, %esi  # simple copy bytes algorithm
        mov     $label, %edi
        mov     $0xb, %ecx
loop1:
        lodsb
        stosb
        loop    loop1
        ret
offset_to_write:                        # these instructions will be
        push    $0                      # executed eventually
        call    exit
end:


2 commentaires

Je ne sais pas comment il est fait sur Linux, mais vous pourriez instruire votre lieur d'utiliser des indicateurs personnalisés pour la section .Text, soit pour pouvoir les spécifier dans la source (par défaut pour .Data est RW, car .text est RX)


@Ruslik puis-je spécifier de la source l'autorisation du segment de code (texte) à l'aide de RWX?


3 Réponses :


5
votes

Les CPU modernes ont une fonctionnalité appelée DEP qui empêche l'exécution du code sur la pile. Auparavant, c'était possible; Maintenant, ce n'est pas le cas. Le binaire est chargé en mémoire en lecture seule par défaut.

Avec cela, vous pouvez utiliser l'appel du système MProtect pour marquer votre emplacement de votre binaire en mémoire comme exécutable, tant que votre code n'est pas déprécié. Alors n'essayez pas de mettre du code et de la pile, puis de le sauter.


5 commentaires

MProtect Prot_read | Prot_write | Prot_exec devrait désactiver DEP. En outre, cela a appelé non seulement dans Mme World


Mais je n'essaie pas de manipuler la pile, j'essaie juste de changer / générer des instructions dans le segment de code.


@osgx: "Cela a appelé Deper uniquement dans Mme World" Ce n'est tout simplement pas vrai ; Dep est un terme commun.


Certains blogs peuvent appeler chaque Protection de l'espace exécutable "Dep", mais lorsqu'ils utilisent Wikipedia comme source primaire, nous pouvons faire la même page - page en.wikipedia.org/wiki/executable_space_protection répertorie non uniquement dans la section MS OS comme" sous Windows XP ou Server 2003, la fonctionnalité est appelée la prévention de l'exécution de données (Abréviated Dep ) ". Si je comprends bien, MM a créé le terme "DEP" (dans 2003-2004 ), puis il a été utilisé par des autres fournisseurs.


D'autres systèmes d'exploitation appellent cette "protection d'exécution". Ce n'est pas une nouvelle caractéristique par aucun moyen, même le 80286 l'a eu. Microsoft vient d'inventer cet acronyme pour que cela sonne comme ils ont inventé quelque chose.



14
votes

Vous devez modifier les autorisations d'accès à la mémoire en runtime. xxx


3 commentaires

Puis-je utiliser cette fonction de montage? Ai-je besoin de privilèges spéciaux afin de l'utiliser?


Oui, vous pouvez. Le moyen facile est de compiler C code C avec MProtect à .s Fichier (-S) et copier-coller l'appel MProtect à votre code. Les privilèges spéciaux ne sont pas nécessaires pour la mémoire, appartenant à votre processus, et il ne doit y avoir de correctifs super-sécurité au noyau


Il y a un bon article (le seul inconvénient - utilise Intel Syntaxe) ASM.SOURCEFORGE.net/ Articles / SMC.HTML



2
votes

Vous pouvez également désactiver la protection en écriture pour l'ensemble du programme en passant le commutateur -n sur la liaison. Si vous appelez la liaison à partir de GCC, passez wl, -n . Si vous invoquez ld directement, passez -n .


0 commentaires