c ++ - успешно распечатывает строковые индексы диапазона - PullRequest
0 голосов
/ 02 сентября 2018

Я новичок в C ++, и я играл с классом string. Я понял, когда я запускаю следующий код в CodeBlocks с компилятором GNU:

#include <iostream>

using namespace std;

int main()
{
    string test = "hi";
    cout<<"char is : "<<test[100];
    return 0;
}

Я на самом деле получаю значение. Я играю с индексами (я пробовал от 100 до 10000), и я могу получить других персонажей, или я могу получить ноль. Означает ли это, что вы можете читать части памяти, которые вам не нужны? вы можете использовать его для эксплуатации? или это просто мой разум иллюзорен?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Это неопределенное поведение, поэтому может случиться что угодно. Компилятор может оптимизировать строку, вставить abort () или сделать что-нибудь еще.

Если компилятор не вносит больших изменений в код, а std::string реализует оптимизацию коротких строк, тогда test[100] получит доступ к кадру стека одной из функций, вызывающих main().

Эти функции отвечают за загрузку разделяемых библиотек, размещение переменных среды, создание глобальных объектов, таких как std::cout, а также создание и передачу argc, argv, в main(). Этот код заглядывает в стек этих функций. В системе с защитой памяти, такой как Linux или Windows, с достаточно удаленным доступом, приложение будет аварийно завершено.

Не полагайтесь на это, поскольку компилятор может сделать с ним что-то совершенно неожиданное.

И да, это может привести к эксплуатации. Если вне границ зависит от ввода пользователя, то этот пользователь может читать или записывать данные, которые он не должен был. Это один из способов распространения червя или вируса: они читают пароли или пишут код, который будет выполняться после возврата из функции.

0 голосов
/ 02 сентября 2018

Ответ прост - неопределенное поведение. Нет, вы не можете доверять этой информации, и это настоятельно не рекомендуется. Не делай этого ..

...