Во время работы над эксплойтом переполнения буфера я нашел что-то действительно странное. Я успешно обнаружил, что мне нужно предоставить 32 символа перед правильным адресом, на который я хочу перейти, и что правильный адрес 0x08048a37
. Когда я выполнил
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')"
выводит на консоль два разных выхода. Символы, конечно, не читаемы, но они визуально отличаются.
Интересно, почему это происходит?