Kendini değiştiren kod hakkında bir makale buldum ve bazı örnekler yapmaya çalıştım, ancak her zaman bölümleme hataları alıyoruz. Anlayabildiğim kadarıyla, bellek izinlerinde bir ihlal var. Kod bölümü (r) ead/e (x) olur ve bu nedenle yazma denemesi bu hataya neden olur. Programı, çalışma zamanında veya daha önce bellek izinlerini değiştirerek test etmenin bir yolu var mı? Linux kullanıyorum ve örnek GAS meclisinde yazılmıştır.Kendini değiştiren kod Linux'ta her zaman parçalanma hataları
.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:
işte osgx önerdiği değiştirildikten sonra bir çalışma kodudur. (Bunu çöküyor & bağlantı & koşmak araya ama öyle gdb kullanarak izlemek eğer kodunu değiştirir Aslında eğer!)
.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:
Linux'ta nasıl yapıldığından emin değilsiniz, ancak ya yönlendiriciye .text bölümü için özel bayraklar kullanma talimatı verebilirsiniz, ya kaynaklarda belirtilebilir (varsayılan değer .data RW'dir, çünkü .text RX'dir) – ruslik
@ruslik Kaynaktan rwx kullanarak kod (metin) segmentinin iznini belirleyebilir miyim? –