Мой друг создал небольшой ассемблер доказательств концепции, который работал на x86. Я решил портировать его и для x86_64, но сразу же попал в проблему.Ptyon ctypes и вызовы функций
Я написал небольшую часть программы в C, а затем скомпилировал и передал код. После этого я вставил его в мой питон скрипт, поэтому код 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 -area. Если, конечно, вы не используете защиту от записи в .text
Но почему же все-таки PROT_EXEC везде? Разве это не просто поможет чрезвычайно, чтобы ваш .text-раздел был защищен от записи?
Даже лучший ответ. valloc полезен, например, обратите внимание, что после этого бит EXEC не очищается. Но меня, возможно, не интересует ни один аспект. – Cheery 2008-11-09 08:45:43