Mein Freund produzierte einen kleinen Proof-of-Concept-Assembler, der auf x86 arbeitete. Ich entschied mich, es auch für x86_64 zu portieren, aber ich traf sofort ein Problem.Python Ctypes und Funktionsaufrufe
Ich schrieb ein kleines Stück Programm in C, dann kompilierte und objdumped den Code. Danach habe ich es mein Python-Skript eingefügt, damit der x86_64-Code korrekt ist:
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)
Nun, warum diese Skript Segmentierungsfehler immer wieder tun, wenn ich es laufen?
Ich habe noch eine Frage über mprotect und keine Ausführungsflagge. Es wird gesagt, dass es gegen die meisten grundlegenden Sicherheitsexplosionen wie Pufferüberläufe schützt. Aber was ist der wahre Grund dafür? Du könntest einfach weiterschreiben, bis du auf den .text triffst, dann sprichst du deine Anweisungen in einen schönen PROT_EXEC-Bereich. Es sei denn natürlich, verwenden Sie einen Schreibschutz in. Text
Aber dann, warum haben diese PROT_EXEC überall sowieso? Wäre es nicht nur enorm hilfreich, wenn Ihr .text-Bereich schreibgeschützt ist?
Noch bessere Antwort. valloc ist nützlich, wie zu beachten ist, dass das EXEC-Bit danach nicht gelöscht wird. Aber ich bin vielleicht an keinem Aspekt interessiert. – Cheery