Mi amigo produjo un pequeño ensamblador de prueba de concepto que funcionaba en x86. Decidí portarlo también para x86_64, pero de inmediato me encontré con un problema.Códigos de Python y llamadas a funciones
Escribí un pequeño trozo de programa en C, luego compilé y objdumped el código. Después de eso me introduje a mi script en Python, por lo tanto, el código es correcto 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)
Ahora, ¿por qué este guión sigue haciendo fallo de segmentación cada vez que lo ejecuto?
Tengo una pregunta sobre mprotect y ninguna bandera de ejecución. Se dice que protege contra la mayoría de los ataques de seguridad básicos, como los desbordamientos del búfer. Pero, ¿cuál es la verdadera razón por la que está en uso? Podrías seguir escribiendo hasta que toques el texto. Luego, inserta tus instrucciones en una agradable zona PROT_EXEC. A menos que, por supuesto, utilice una protección de escritura en .text
Pero entonces, ¿por qué tiene ese PROT_EXEC en todas partes? ¿No ayudaría tremendamente que su sección .text esté protegida contra escritura?
Aún mejor respuesta. valloc es útil, como es notar que el bit EXEC no se borra después de esto. Pero quizás no estoy interesado en ninguno de los aspectos. – Cheery