• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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 - уже нет.
 
Мы в соцсетях:

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