एक बफर ओवरफ्लो शोषण पर काम करते समय मुझे कुछ वास्तव में अजीब मिला। मैंने सफलतापूर्वक पाया है कि मुझे उचित पते से पहले 32 वर्ण प्रदान करने की आवश्यकता है, जिसे मैं कूदना चाहता हूं और उचित पता 0x08048a37
है। जब मैंनेपायथन 3 प्रिंट() बनाम पायथन 2 प्रिंट
python -c "print '-'*32+'\x37\x8a\x04\x08'" | ./MyExecutable
शोषण के परिणामस्वरूप सफलता मिली। लेकिन, जब मैंने कोशिश की:
python3 -c "print('-'*32+'\x37\x8a\x04\x08')" | ./MyExecutable
ऐसा नहीं हुआ। निष्पादन योग्य बस वांछित पते पर कूदने के बिना एक सेगमेंटेशन फॉल्ट में परिणाम हुआ। वास्तव में, कंसोल पर दो अलग-अलग उत्पादन में
python -c "print '-'*32+'\x37\x8a\x04\x08'"
और
python3 -c "print('-'*32+'\x37\x8a\x04\x08')"
परिणाम को क्रियान्वित। पात्र, निश्चित रूप से, पठनीय नहीं हैं लेकिन वे दृष्टि से अलग हैं।
मुझे आश्चर्य है कि यह क्यों हो रहा है?