Исправлено. tzselect
не работает. Чтобы изменить общесистемное использование времени:dpkg-reconfigure tzdata
Итак, ваша программа делает следующее. Функция check_pwd
выделяет буфер в стеке, который вы переполняете, поэтому адрес возврата поврежден. Вы пытаетесь выбрать это искажение так, чтобы оно указывало на другую функцию, print_my_pwd
, строка :GUUUU
, если интерпретировать ее как 64-битное значение на машине с прямым порядком байтов, равна 0x??0055555555473A, причем первые 8 бит не определены. Если 8 бит равны нулю, то у вас есть адрес print_my_pwd
. 16 A
символов предназначены для заполнения 8-байтового массива name
, а затем перезаписывают сохраненный указатель кадра.
Итак, ваш вопрос: «Если мне нужен 0 байт как часть адреса возврата, как мне указать его в командной строке?», на что ответ «это не имеет значения, так как вы используете strcpy выполнить переполнение, и это остановится на байте NUL, поэтому атака не удастся».
В целом ответ на ваш вопрос состоит в том, что интерфейс ядра основан на строках C, поэтому даже если ваша программа использует memcpy, а не strcpy, вы все равно не сможете делать то, что хотите.
Реальные атаки на переполнение буфера переходят к собственному коду, который часто конструирует значение для сохранения в памяти и не должен беспокоиться о символах NUL.