Компилятор проверок безопасности на переполнение буфера.

Здесь обсуждаются проблемы мироустройства.
Post Reply
User avatar
cmd.exe
Posts: 378
Joined: Fri 16 Apr, 2010 18:26
Location: Нижний Новгород
Has thanked: 181 times
Been thanked: 10 times
Contact:

Компилятор проверок безопасности на переполнение буфера.

Post by cmd.exe »

Есть проэект который ругается на:

Code: Select all

Example.obj : error LNK2019: unresolved external symbol ___security_cookie referenced in function _example_function
Example.obj : error LNK2019: unresolved external symbol @__security_check_cookie@4 referenced in function _example_function
неразрешенный внешний символ

Code: Select all

Example.obj : error LNK2019: неразрешенный внешний символ ___security_cookie ссылки в функциею _example_function
Example.obj : error LNK2019: неразрешенный внешний символ @__security_check_cookie@4 ссылки в функциею _example_function
И из всех решений самые простые:
[1]Убрать флаг /GS (buffer security check) при компиляции. Самый худший вариант! А если переполнение буфера, то что будет?
[2]Дописать в программе(FROM MSDN): // Интересный вариант

Code: Select all

extern "C" const DWORD_PTR __security_cookie = 0xE64EBB40;

extern "C" void __fastcall __security_check_cookie(DWORD_PTR cookie)
{
    if (cookie != __security_cookie)
        __asm int 3;
}
[3]Частный случай для WIN64:

Code: Select all

extern "C" {

#ifdef _WIN64
#define kDefaultSecurityCookie 0x2B992DDFA23249D6  //?? X64 DWORD
#else  /* _WIN64 */
#define kDefaultSecurityCookie 0xBB40E64E //?? X86 DWORD, А почему не 0xE64EBB40
#endif  /* _WIN64 */

DWORD_PTR __security_cookie = kDefaultSecurityCookie;

void __fastcall __security_check_cookie(DWORD_PTR) {
    return;

    /* Immediately return if the local cookie is OK. */
    // if (cookie == __security_cookie)
    //    return;

    /* Report the failure */
    // report_failure();
}

};  // extern "C"
[4]
Написать свой вариант:
security_cookie это частный случай. И имя функции может быть любое.
А вместо __asm int 3; использовать более явное описание.

0x35f1fb6f то-же вполне возможно...))) В принципе в примере [3] есть всё для того, что-бы узнать его значение, а можно не узнавать, просто при компиляции для него будет выделено больше памяти.

Кстати кто может показать более интересные случаи данного вопроса?
I've been using Vim for about 2 years now, mostly because I can't figure out how to exit it. (c) I Am Devloper
I know nothing except the fact of my ignorance. (с) Socrates
Post Reply

Return to “О тщете всего сущего”