Перезапись буфера на стеке (Stackoverflow) | Защита Stack Canary | Протекция стека
#soer #itubeteam
Основной канал для общения и публикации новых видео - Телегарм - t.me/softwareengineervlog
Спонсорство - donate.s0er.ru
Сайт платным контентом - soer.pro
Зеркало для видео Дзен Видео - zen.yandex.ru/id/5f578bdf22e2...
GitHub - github.com/soerdev
Чат для программистов - / discord
Группа ВК - codeartblog
Пікірлер: 117
Еще больше закрытых материалов на www.patreon.com/soersoft Вы знали, что я пишу книгу? Так вот первая глава уже доступна для патронов.
@wolfich4684
4 жыл бұрын
Как вы себя чувствуете? Мне всегда кажется что вы чувствуете сильную усталость и будто "воротит" от этого всего ? Но за инфу спасибо. Всегда авторская т.зр. и не слизана с других источников
@S0ERDEVS
4 жыл бұрын
@@wolfich4684 прекрасно себя чувствую, просто я душный )
@ibl8587
4 жыл бұрын
да блин 10$ там минимум, дорого для меня
Символично, что длительное время канареек использовали в качестве раннего способа обнаружения в шахтах рудничного газа. Шахтеры брали клетку с канарейкой в шахту и во время работы следили за птицей, которая очень чувствительна к газам, включая метан и угарный газ, и гибнет даже от незначительной примеси их в воздухе. Видимо стековая "канарейка" имеет схожую учесть.
- в main добавить проверку argc для безопасной индексации массива argv - в checkPass принимать pass как const char* - проверка pass на NULL - можно вообще убрать result_flag, и вместо этого сразу возвращать результат проверки как return 0; или return 1; - ну и вместо strcpy и strcmp использовать strncpy strncmp, где третим аргументом передавать длину пароля :)
@kolyan199816
4 жыл бұрын
В c++ еще можно пойти дальше и использовать strncpy_s ;)
@diceline1677
4 жыл бұрын
Где можно узнать эту информацию? Если не сложно, то можешь скинуть ссылки или скажи, что это за тема, чтобы я смог копать в этом направлении. Я смогу узнать про это, если буду изучать: архитектуру компьютера(программная, аппаратная), ассемблер? Как конкретно этот топик называется?
@levix7859
4 жыл бұрын
DiceLine если ты про использование этого, учи язык С. Если вообщем, это Computer science. Это раздел о памяти.
@iEfimoff
4 жыл бұрын
локальная переменная result_flag была нужена для того чтобы перетереть значение при stackoverflow
@smolewood
19 күн бұрын
Можно вообще обойтись без функции srtcpy и сразу в srtcmp передать аргумент строку: strcmp(pass, "some_pass");
Видео по реверсу лучше всего заходят :)
Никогда не понимал, зачем на втором курсе вуза учил этот ассемблер, но когда смотрел видео, был удивлен, что понимаю весь дизассемблированный код. Видимо не зря. Спасибо за контент.
@TheNihaonyan
4 жыл бұрын
Если ты не понимаешь, зачем ты его учил, то ты его в итоге не выучил, иначе бы как минимум понял, зачем
@sergbo3114
4 жыл бұрын
@@TheNihaonyan Все когда молодые глупые по неопытности, и это не прям таки плохо, от этого никуда не деться, это нужно просто пережить. Придет время и ты узнаешь нужно это было или нет. Ну и отдельное слово по поводу нашей системы образования, у нас она "широкопрофильная". Вот пример из личной жизни: Родители у меня были не богатые, потому первое место послешкольного образования было ПТУ. Я учился, кто бы мог подумать на специальность "оператор компьютерного набора", да-да было такое. Это человек-печатная машина) Ну по сути это пользователь МС Офис) Так вот там мы учили паскаль. Скажите пожалуйста зачем? И там никто нас не спрашивал. И все от него стонали. Но так как с шестого класса лучший мой друг это паяльник, а в 9 я подключал уже самодельные контроллеры НЖМД, то это лично мне пришлось по вкусу)
Спасибо за канал, Soer.
Огромное спасибо! Очень хорошо рассказываешь и делишься ценными данными!
Спасибо за видос! Хотелось бы еще сказать отдельное спасибо за задачку про поиск ошибок в коде - мне кажется это очень крутой формат, такое всегда очень интересно смотреть
Спасибо, очень интересно. Никогда не задумывался о том, как работают проверки стека. Оказалось всё предельно просто :)
1. пароль в открытом виде. можно было XOR хотя бы. 2. использовать безопасную strNcpy 3. strNcmp с проверкой длины строки. strcmp строка должна заканчиваться 0x00, если это не произойдет можно залить shell code. 4. result_flag перетирается при stack overflow. int result_flag используется как boolean. убрать result_flag и сделать return strNcmp() == 0. 5. нет проверки на количество аргуменов 6. нет проверки пароля на null or empty 7. "оптимизация" два вызова printf... можно было так: printf(checkPass(argv[1]) ? ACCESS_GRANTED : ACCESS_DENIED) 8. Опеделить строки Granted, Denied в define #define ACCESS_GRANTED "Granted " #define ACCESS_DENIED "Denied " 9. при инициализации массива делать ZeroMemory(), memset(0) или { 0 } 10. зачем копировать строку - для переполнения буфера. убрать копирование строки и буфер. использовать указатель на char.
Отлично. Я еще не дорос до такого уровня, но все равно очень полезно, спасибо
Красавчик!!! Интересно. Жаль, в школе так не объясняли
Спасибо, очень интересно!
Спасибо, было интересно.
Спасибо за видео!
Грамотный мужик, лайк
Есть ещё технология ASLR, борется с повреждением стека за счёт его рандомного размещения в адресном пространстве процесса. В таком случае переполнение стека приводит к segmentation fault . А в целом стоит пользоваться strncpy snprintf явно указывая что не больше столких байт записать и проверять что произошло.
Спасибо, следующее видео про то как ты сделал так указку! :) ПС: mov sp, 0x9000 mov bp, sp Вот и весь стек в Real Mode ;) Я бы наверное с помощью getopt() проанализировал ключи командной строки, а там вообще пароль? Проверил с помощью regex, раз это пароль наверно нужно применить какое-нибудь шифрование чтобы не просто строка с паролем в бинарнике была, а то ты научил уже крэкерству ;) Ну и ещё const char* pass и проверка nullptr либо просто в комментарии к функции написал что «это ваши проблемы что вы нуль указатель в функцию посылаете»
интересное видео !
Здорово, помогло въехать в тему и разобраться с решением одной задачки. Насколько реально будет записать видео о применении техник обхода подобного рода защит? В частности, было бы интересно послушать грамотную теорию и практический пример применения уязвимости ret2libc (в русском сегменте лучшее, что я нашел на данный момент, это видео разборы с CTF, но там это все подано, как я понимаю, без сценария и, соответственно, как-то скомканно)
Интересное видео, спасибо. А какие другие архитектуры стека бывают? Бывает, например, чтобы локальные переменные не перемешивались с адресами возвратов, а лежали отдельно?
Слушаю вас с восторгом, не хрена не понимаю, от слова совсем, но музыка этих слов завораживает... наверное в прошлой дизни был айтишником) не уверен в правильном понимании этого слова)))
Круто... Офигел, от того, что, в принципе, все понял... Только единственный момент - сама канарейка - это какой-то конкретный тип данных или проц просто именует n количество ячеек в стеке?
Работаю в продажах импортных запчастей к горной технике. Жду с нетерпением выпуски Соера. Подписка. Что происходит?))
@albrehtdurer557
4 жыл бұрын
у тебя проблемы с самоидентифекацией))
По моему эту "защиту" с канарейкой очень просто обойти: т.к. позиция канарейки в стеке [rbp-0x8] и её размер 8 байт известны, то можно сначала прочитать из буфера строки в дополнительную переменную (а1) 16+8 байт+8 байт (т.е. сам буфер строки + 8 байт канарейки + 8 байт регистр rbp), после чего добавить к этой же переменной а1 адрес возврата и записать всё это обратно в буфер. Таким образом и канарейка останется целой и адрес возврата подменим.
Объясни пожалуйста, зачем нужны символы для декомпилирования? Это некая таблица или что это вообще и с чем едят ?
Что вы имели ввиду под словом "стрикнутая программа" на 13:42?
Когда увидел функцию "chekPass" , пришли воспоминания о уборных и комнатах проживания в общежитии, где слово "безопасность" было на последнем месте.
Soer можешь более подробно про радар рассказать: он платный? Можно его вместо gdb для отладки использовать, просматривать код а не инструкции, сильно от gdb отличается, чтобы разобраться с радаром опять мануал на 1000 страниц как к gdb читать придётся?
Забавненько, ради интереса перенабрал текст программы, скомпилил и судя по всему никакой канарейки нет. Ибо при переполнении написало успешный доступ. gcc обызан был использовать канарейку или есть нюансы компиляции? gcc --version gcc (Debian 8.3.0-6) 8.3.0
Знаю что за такт можно выполнить несколько команд, про развертывание циклов для оптимизации... Про структурки PEB, TEB, SEH, LDT, GDT, SDT, SSDT и где потом работать с такими знаниями?
блин только хотел задать тебе вопрос на эту тему))
блин, я с winapi разобраться не могу в c++, и смотря на людей, которые на ходу читают асемблированный код, я охереваю, это сколько нужно изучать всего, и сколько практиковаться, для такого уровня, хотя может это для меня выский уровень, скорей всего, для него тоже есть люди, до которых ему оченьь долго расти
@johan.de.matan.
3 жыл бұрын
Читать такой код проще, чем кажется. Винапишку сложнее выучить. Разве что такие восторжения вызываны, шо ты совсем ассмеблер не трогал. Ну ибо я немного знаю - и без труда понял
Отличное видео, мотивирует изучать архитектуру. Что собственно для низкого уровня x86 является проблемой, нет мотива изучать машинный код. Современные оптимизирующие компиляторы выполняют свою работу на отлично, не каждый человек сможет написать код по качеству не хуже сгенерированного компиляторами. Про лучше я вобще молчу, исключением возможно являются специфические математические алгоритмы, которые трудно написать эффективно на высоком уровне. (мне кажется это несовершенство компиляторов, поправьте меня если я не прав)
@user-yc6ez9lf9t
4 жыл бұрын
Трудно эффективно написать? Как напишите так и скомпилирует. Если же хочется самому с привилегированными командами поиграться , можно вставить асм вставки.
@penatoliy
4 жыл бұрын
@@user-yc6ez9lf9t В пример curve25519, реализация sandy2x. Почему оно написано полностью на asm?
@user-yc6ez9lf9t
4 жыл бұрын
@@penatoliy Ты про это ? github.com/msotoodeh/curve25519 . Там же большая часть на Си.
Офигеть
Канареечка проверяется после каждого возвращения из процедуры?
Это всё замечательно. А практически это как применимо?
Спасибо за видео, подписался. Я бы хотел уточнить, при переполнении стека перезаписывается адрес возрата, который находится в самом верху стекового кадра?
@serhiis_
4 жыл бұрын
стек записывается от старших адресов к младшим. поэтому можно переписать любую переменную и адрес возврата хоть этой функции хоть всех по стеку до самого верха и все их переменные соответственно.
@serhiis_
4 жыл бұрын
так же есть механизм перехода к новому стеку. так можно делать что бы тестировать какие-то небезопасные функции или либы не повреждая свой стек.
@artemkovera5500
4 жыл бұрын
@@serhiis_ спасибо
Есть желание в следующих видео про ARM рассказать?
7:55 - сегфолт при отсутствии параметров - явно указан возрващаемый тип main возравта значения нет - неинициализирован password_buffer - нет протекта входных данных checkPass() (если длинна pass больше буфера будет горе)
@serhiis_
4 жыл бұрын
буфер не нужно ни когда инициализировать, если копируется строка. memset нужет лишь в крайних случаях когда создаете структуру и лень вручную проставить все ее поля в 0 - к тому же в ручную будет быстрее, чем ресурснозатратная функция memset. Хотя некотрые компиляторы это понимают и заменяют на этапе оптимизации memset на struct.a=0 struct.b=0. и тд.
Здравствуйте, подскажите, пожалуйста, что за стилус вы используете, он подключен у вас напрямую к стационарнику?
@S0ERDEVS
4 жыл бұрын
instagram.com/stories/highlights/18003640921249380/
@diff7829
4 жыл бұрын
@@S0ERDEVS а можно ещё ссылку? Недоступно) мб есть где ещё инфа? Даже выгуглить нереально
Кантупер кантупер ОоОуо)))
насколько сильно проверка канарейки снижает производительность?
Прям как в песне Если ты спишь зачем будить а если нет то и вовсе смешно ))) Те кто знают про канарейку в принципе она им не нужна а те кто не знают тем более Типичный Си ) ну или плюсы кому как угодно )
7:55 Я нашел: - магические константы - непроверенные входные данные - неоптимальные типы Больше же ничего нет? А что за безопасное программирование?
@pppdddqqqbbb
4 жыл бұрын
разброс оформления указателей: и type **ptr, и type** ptr. За последнее надо сразу кадилом херачить. )
@ancubic1549
4 жыл бұрын
Еще можно захэшировать пароль
@Eraston
4 жыл бұрын
@@pppdddqqqbbb за оформление указателей кадилом херачить надо разработчика синтаксиса в первую очередь ) ибо указатель на тип тоже тип, только указателя
@pppdddqqqbbb
4 жыл бұрын
@@Eraston это не «указатель на тип». Это переменная, хранящая *адрес*, поэтому у неё (переменной) есть специальный значочек. Кому не нравится - пишут на Паскале. И вот такие пейсатели на Паскале и пишут ptr, без значочка, наивно что-то там себе полагая о том, как якобы должно быть. Этот язык не для вас, в таком случае. ;-P
@Eraston
4 жыл бұрын
@@pppdddqqqbbb да ладно? Адрес? Правда? А нахрен тогда адресу тип? Говорят, можно перечитывать текст
Здравствуйте я конечно не понимаю в этом всем. Но у меня вопрос, во время одной игры выкидывает из нее и пишет LogonUI.exe Обнаружено переполнение стекового буфера в данном приложении. Это переполнение может позволить злоумышленнику получить управление над данным приложением. Сама игра лицензия от компании Ubisoft. Подскажите что делать в данном случае? Заранее спасибо.
А как это вы так сделали?
Кевин Костнер отдыхает
Скажите пожалуйста, а можно как-то получить в радаре не названия переменных которые функция принимает, а конкретно их значения?
@S0ERDEVS
4 жыл бұрын
Это в режиме отладки нужно смотреть, при статическом анализе не показывает - radare.gitbooks.io/radare2book/debugger/intro.html
Я немного не понял, может ли случится ситуация, когда адрес возврата затрется, а канарейка останется и пройдет тест от системы?:3
@kkkargeva
3 жыл бұрын
может
Помоги пожалуйста захожу в настройки винды нажимаю буфер обмена а у меня ошибка переполнен стековой буфер помоги от этого избавиться
А меня заинтересовала указка) Что за зверь?)
@S0ERDEVS
4 жыл бұрын
instagram.com/stories/highlights/18003640921249380/
Спасибо за увеличенный текст.
По правилам языка C и соответственно С++ массивы, как аргументы функций всегда передаются в виде указателей. Поэтому бесконечным массивом (строкой C) сорвать стек невозможно. Как и иными манипуляциями с аргументами функций. Вся проблема, исключительно, кроется в старых функциях по обработке «C строк», ограничивающих длину только нулем. Перезапись стека может произойти, если вы создадите массив как локальную переменную (char str[40]; память выделяется в стеке) и затем, без проверки максимальной допустимой длины начнете туда копировать длинную входную строку. То это точно может переписать весь стек. Используй новые безопасные C функции по работе со строками, принимающие лимит строки, или класс string. Тот, кто всегда, перед обработкой проверял strlen() допустимый размер строк аргументов функций, тот не «мочил» бедных канареек.
@serhiis_
4 жыл бұрын
в си все указатели всегда доставали немало хлопот программистам. поэтому появились такие языки как шарп в которых нельзя без unsafe манипулировать указателями. в java вообще ни как нельзя.
@stanislav5698
4 жыл бұрын
@@serhiis_ «умные» указатели в С++ появились раньше, чем C#. При этом unique_ptr и shared_ptr обеспечивают сравнимый функционал, но без механизма сборки мусора. «Сборка мусора» приводит к подтормаживанию потоков C#. C# - это язык более высокого уровня и предназначен для создания приложений с меньшей критичностью к производительности.
@serhiis_
4 жыл бұрын
@@stanislav5698 в objc и его потомке - свифте сборщик мусора вырезали с корнем. сейчас используется ARC. А с++ 11 появился не раньше шарпа не надо. Дотнет появился в 2000 и шарп в 2001.
@serhiis_
4 жыл бұрын
@@stanislav5698 к тому же С++ до сих пор не позволяет узнать есть ли метод у обьекта. obj->foo() и будет плохо плюсам если там такого метода нет. В objc можно легко это проверить, а можно вовсе в написать расширение класса и при компиляции он не будет вызывать исключение на несуществующий метод. Тоже самое можно и в рантайме назначить любому классу, например какой-то класс в либе которого даже в документации нету, и он вам не нравится, берете его в рантайме меняете. Это называется свизл-функции.
@serhiis_
4 жыл бұрын
@@stanislav5698 а знать есть ли метод у обьекта - это довольно полезная фича языка. Так можно задавать спокойно опциональные методы в интерфейсах. Да вы можете интерфейс определить по дефолту, но если либа была скомпилина не вами то применить совой интерфейс к обьекту который либа возвращает вы не можете. А опциональные методы и проперти - это отличное поведение.
Кто знает как отключить баунд чек в vb.net???
думал щас stackoverflow.com буду взламывать...
При включении ноутбука пишет ошибка. Обнаружено переполнение стекового буфера в данном положении.
@magomedbeg_magomedov
2 жыл бұрын
После 2 минут ошибка исчезает показывает серый пустой экран и так целый день
@magomedbeg_magomedov
2 жыл бұрын
Выручай 😁
Одному мне интересно почему это называется канарейкой, а не каким-либо «ключом безопасности стека»?
@emilio88regis
4 жыл бұрын
Полагаю, в честь известного метода обнаружения газа в шахтах. В доэлектрическую эпоху при спуске в шахту рабочие брали с собой клетку с канарейкой. Смертельные концентрации газа для канарейки ниже, чем для людей, и как только канарейка переставала чирикать, полагалось немедленно эвакуироваться. Позже придумали массу технических приблуд, но даже современные газоанализаторы до сих пор называются "Канарейка".
принимай формы, пиши в базу, получай деньги, что тебе еще надо?
а я хеловордщик
Опять этот эльф, на высшем эльфийском разговаривает! Я ливаю!
@penatoliy
4 жыл бұрын
Не согласен, всё очень понятно объяснено и главное приведены примеры. Видимо вы не видели, настоящий эльфийский) Посмотрите на любую статью написанную математическим языком (например я сейчас изучаю "unscented transform" и чувствую некий дискомфорт в чтении литературы об этом методе работы с вероятностями.
@shasoleoshboshasart7096
4 жыл бұрын
@@penatoliy Да согласен! Все максимально понятно, но я не смог удержатся и не оставить этот коммент.
12 1116 128 164 ё113
@alexreg78
3 жыл бұрын
маскируем числом ПИ