Мой друг создал небольшой проверочный ассемблер, который работал на x86. Я решил портировать его и для x86_64, но сразу столкнулся с проблемой.
Я написал небольшую часть программы на C, затем скомпилировал и скопировал код. После этого я вставил его в свой скрипт на python, поэтому код x86_64 правильный:
from ctypes import cast, CFUNCTYPE, c_char_p, c_long
buffer = ''.join(map(chr, [ #0000000000000000 <add>:
0x55, # push %rbp
0x48, 0x89, 0xe5, # mov %rsp,%rbp
0x48, 0x89, 0x7d, 0xf8, # mov %rdi,-0x8(%rbp)
0x48, 0x8b, 0x45, 0xf8, # mov -0x8(%rbp),%rax
0x48, 0x83, 0xc0, 0x0a, # add $0xa,%rax
0xc9, # leaveq
0xc3, # retq
]))
fptr = cast(c_char_p(buffer), CFUNCTYPE(c_long, c_long))
print fptr(1234)
Теперь, почему этот скрипт продолжает делать ошибку сегментации, когда я его запускаю?
У меня еще есть вопрос о mprotect и об отсутствии флага выполнения. Говорят, что он защищает от большинства основных угроз безопасности, таких как переполнение буфера. Но какова реальная причина его использования? Вы можете просто продолжать писать, пока не нажмете .text, а затем добавить свои инструкции в красивую область PROT_EXEC. Если, конечно, вы не используете защиту от записи в .text
Но тогда почему же этот PROT_EXEC везде везде? Разве это не поможет, если ваш раздел .text защищен от записи?