Während ich an einem Pufferüberlauf-Exploit arbeitete, fand ich etwas wirklich seltsames. Ich habe erfolgreich gefunden, dass ich 32 Zeichen vor der richtigen Adresse bereitstellen muss, zu der ich springen möchte und dass die richtige Adresse 0x08048a37
ist. Wenn ich ausgeführtPython3 print() Vs Python2 print
python -c "print '-'*32+'\x37\x8a\x04\x08'" | ./MyExecutable
die Exploit führte zu einem Erfolg. Aber, als ich versuchte:
python3 -c "print('-'*32+'\x37\x8a\x04\x08')" | ./MyExecutable
es tat es nicht. Die ausführbare Datei führte einfach zu einer Segmentierungsfehler, ohne zu der gewünschten Adresse zu springen. In der Tat, die Ausführung
python -c "print '-'*32+'\x37\x8a\x04\x08'"
und
python3 -c "print('-'*32+'\x37\x8a\x04\x08')"
Ergebnisse in zwei unterschiedlichen Ausgängen auf der Konsole. Die Charaktere sind natürlich nicht lesbar, aber sie sind visuell unterschiedlich.
Ich frage mich, warum passiert das?