• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Strcpy() - может искажать значение ?

  • Автор темы Guest
  • Дата начала
G

Guest

Код:
char sss[2]="01";
//--------------------
char* F1()
{
char s[3];
switch(sss[0])
{
case '0': s[0]='Z'; break;
case '1': s[0]='W';
}
switch(sss[1])
{
case '0': s[1]='X'; break;
case '1': s[1]='Y';
}
s[2]='\0';
//ShowMessage(s);
return s;
}
//--------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char s[5]={0};
strcpy(s,F1());
ShowMessage(AnsiString(s));
}

При запуске данного кода выдаёт .@ а должен выдавать ZY
Но если в F1() раскомментировать ShowMessage(s), то будет выдавать правильный результат
Где происходит искажение результата? В функции strcpy(s,F1()) ???
 
G

grigsoft

Ты возвращаешь указатель на память, выделенную на стеке. После возврата из фукнции она уже не валидна. Стоит почитать про управление памятью в С\С++.
 
G

Guest

Но при чём здесь ShowMessage()?
Или её действия чисто случайны?
 
D

destr

Конечно, случайны. Видимо где-то что-то не подчистилось ещё, поэтому вы и успеваете скопировать.
 
G

grigsoft

При чем здесь случайность? когда вызывается ShowMessage, строка еще валидная, после выхода из F1 - уже нет.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!