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

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

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

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

Malloc(): Memory Corruption

  • Автор темы PHPMaster
  • Дата начала
P

PHPMaster

Делаю парсер на C

Нужно заменить ascii-коды символов на их эквиваленты

сейчас юзаю:

Код:
char *str_replace(char *str1, char *str2, char *str6)
{
char *str4;
char *str5=malloc(0);

while(strstr(str6, str1)) {
str4 = strstr(str6, str1);
strncpy(str5 + strlen(str5), str6, str4 - str6);
strcat(str5, str2);
str4 += strlen(str1);
str6 = str4;
}
return strcat(str5, str4);
} 

char *htmldecode(char *str)
{
str = str_replace("!", "!", str);
str = str_replace(""", "\"", str);
str = str_replace("#", "#", str);
str = str_replace("$", "$", str);
str = str_replace("%", "%", str);
str = str_replace("&", "&", str);
str = str_replace("'", "'", str);
str = str_replace("(", "(", str);
str = str_replace(")", ")", str);
str = str_replace("*", "*", str);
str = str_replace("+", "+", str);
str = str_replace(",", ",", str);
str = str_replace("-", "-", str);
str = str_replace(".", ".", str);
str = str_replace("/", "/", str);
str = str_replace(":", ":", str);
str = str_replace("&#59,", ";", str);
str = str_replace("<", "<", str);
str = str_replace("=", "=", str);
str = str_replace("&62;", ">", str);
str = str_replace("?", "?", str);
str = str_replace("@", "@", str);
str = str_replace("[", "[", str);
str = str_replace("\", "\\", str);
str = str_replace("]", "]", str);
str = str_replace("^", "^", str);
str = str_replace("_", "_", str);
str = str_replace("`", "`", str);
str = str_replace("{", "{", str);
str = str_replace("|", "|", str);
str = str_replace("}", "}", str);
str = str_replace("~", "~", str);
return (str);
}

Примечание:

str = str_replace("~", "~", str); - в первом аргументе стоит аски код вида (& # 3 7 :rolleyes:, форум их преобразовывает.

При запуске функции вылетает ошибка:

Код:
malloc(): memory corruption: 0x0805eb38 ***
======= Backtrace: =========
/lib/i686/cmov/libc.so.6[0xb75e1256]
/lib/i686/cmov/libc.so.6(__libc_malloc+0x95)[0xb75e2655]

Как исправить? Может, вобще сделать по-другому? Жду ответов.
 
A

abdyla_v

Код:
char *str_replace(char *str1, char *str2, char *str6)
{
char *str4;
char *str5=malloc(0);

while(strstr(str6, str1)) {
str4 = strstr(str6, str1);
strncpy(str5 + strlen(str5), str6, str4 - str6);
strcat(str5, str2);
str4 += strlen(str1);
str6 = str4;
}
return strcat(str5, str4);
}
Мне кажется что тут написаны страшные вещи. Особенно представим что while ниразу не проработает сразу начинаются загадки с strcat(str5, str4); (так как str4 непонятно на что указывает, а для str5 просто обалдеть выделена память, зачем так выделять? и где free тогда для парности ;) )
 
Мы в соцсетях:

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