J'ai trouvé un article sur le code auto-modifiable et j'ai essayé de faire quelques exemples, mais j'ai toujours des fautes de segmentation. Aussi fas que je peux comprendre, il y a une violation dans les permissions de mémoire. Le segment de code est (r) ead/e (x) ecute et ainsi la tentative d'écriture aboutit à 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 avant? J'utilise linux et l'exemple est écrit dans l'assembly GAS.Auto-modification du code toujours des erreurs de segmentation sous Linux
.extern memcpy
.section .data
string:
.asciz "whatever"
string_end:
.section .bss
.lcomm buf, string_end-string
.section .text
.globl main
main:
call changer
mov $string, %edx
label:
push string_end-string
push $buf
push $string
call memcpy
changer:
mov $offset_to_write, %esi
mov $label, %edi
mov $0xb, %ecx
loop1:
lodsb
stosb
loop loop1
ret
offset_to_write:
push 0
call exit
end:
donc après la modification proposée par osgx est un code de travail ici. (En fait, si vous assemblez & lien & terme, il se bloque, mais si vous regardez avec gdb il ne modifie son code!)
.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:
Vous ne savez pas comment cela fonctionne sous linux, mais vous pouvez demander à votre éditeur de liens d'utiliser des indicateurs personnalisés pour la section .text, pour pouvoir les spécifier dans la source (par défaut .data est RW, pour .text est RX – ruslik
@ruslik puis-je spécifier à partir de la source l'autorisation du segment de code (texte) en utilisant rwx? –