Forwarded from ESCalator
Распознаем STL-код легко 😐
Нередко в процессе реверс-инжиниринга мы сталкиваемся с STL-кодом, анализ которого на первый взгляд кажется затруднительным. Неопытный глаз может принять этот код за полезный и потратить время на анализ какого-нибудь конструктора.
На самом деле здесь важно потратить время на то, чтобы распознать STL-контейнер по косвенным признакам, быстро понять, где какие данные лежат, типизировать их и идти дальше. В новой серии постов мы расскажем о самых распространенных контейнерах STL и начнем с
Паттерн1️⃣ : три последовательных чтения/записи указателей
Именно эта тройка и определяет схему памяти вектора. Компилятор расставляет их в памяти последовательно (смещения 0, 8, 16 байт в 64-битном коде). Поэтому в ассемблере мы всегда будем видеть обращения по этим смещениям — это наш главный ориентир.
Сразу посмотрим на простой пример на скриншоте 2. Не имея исходника, видно, что общая картина выглядит скомкано. Слева в ассемблерном коде мы видим кусок кода:
Компилятор обращается к членам вектора как к смещениям относительно базового адреса. Базовый адрес здесь в локальной переменной var_68. Первые 16 байт обнуляются: по смещению
Таким образом, мы видим инициализацию пустого вектора, выполняемую вместо вызова конструктора по умолчанию. Проверяем размер вектора — 16 + 8 = 24 байта. На скриншоте 3 видно, как выглядит вектор на стеке.
Это облегчает нам задачу. Мы пока предполагаем, что работаем с вектором, но все еще есть шанс, что мы захотим зареверсить
Паттерн2️⃣ :
В C++ вектор
Обычно, если используется данный метод, реализация в псевдокоде будет выглядеть примерно так:
Код проверяет, есть ли место для нового элемента в векторе. Если нет, то оно выделяется и элемент добавится в конец вектора. Если есть, значение добавляется по адресу, на который сейчас указывает
👀 Видим, что паттерн просматривается. Есть сравнение указателей
🤝 Теперь, когда понятно, что перед нами вектор, можем воссоздать его структуру (скриншот 6) и структуру, которая его использует, и разметить их в IDA (скриншот 7). Выглядит немного лучше и понятнее.
Несмотря на наличие и других конструкторов и методов у
Stay tuned!
#tip #reverse
@ptescalator (X, Max)
Нередко в процессе реверс-инжиниринга мы сталкиваемся с STL-кодом, анализ которого на первый взгляд кажется затруднительным. Неопытный глаз может принять этот код за полезный и потратить время на анализ какого-нибудь конструктора.
На самом деле здесь важно потратить время на то, чтобы распознать STL-контейнер по косвенным признакам, быстро понять, где какие данные лежат, типизировать их и идти дальше. В новой серии постов мы расскажем о самых распространенных контейнерах STL и начнем с
std::vector.Паттерн
std::vector — один из самых простых контейнеров. Он занимает в памяти 24 байта в 64-битных сборках. Если открыть исходный код std::vector в MSVC STL, мы увидим класс _Vector_val (скриншот 1), который хранит ровно три указателя — начало (_Myfirst) и конец данных (_Mylast), а также конец выделенной памяти (_Myend).Именно эта тройка и определяет схему памяти вектора. Компилятор расставляет их в памяти последовательно (смещения 0, 8, 16 байт в 64-битном коде). Поэтому в ассемблере мы всегда будем видеть обращения по этим смещениям — это наш главный ориентир.
Сразу посмотрим на простой пример на скриншоте 2. Не имея исходника, видно, что общая картина выглядит скомкано. Слева в ассемблерном коде мы видим кусок кода:
xorps xmm1, xmm1 ; и xmm1
movdqu xmmword ptr [rbp+57h+var_68], xmm1 ; записываем 16 нулевых байт по адресу var_68
xor r15d, r15d ; обнуляем r15d
mov [rbp+57h+var_58], r15 ; записываем 8 нулевых байт по адресу var_58
Компилятор обращается к членам вектора как к смещениям относительно базового адреса. Базовый адрес здесь в локальной переменной var_68. Первые 16 байт обнуляются: по смещению
var_68 лежит _Myfirst, по смещению var_60 — _Mylast. Затем обнуляется _Myend, который находится по смещению var_58.Таким образом, мы видим инициализацию пустого вектора, выполняемую вместо вызова конструктора по умолчанию. Проверяем размер вектора — 16 + 8 = 24 байта. На скриншоте 3 видно, как выглядит вектор на стеке.
Это облегчает нам задачу. Мы пока предполагаем, что работаем с вектором, но все еще есть шанс, что мы захотим зареверсить
sub_140002860. Посмотрим на второй паттерн, осознаем себя и не станем этого делать.Паттерн
push_back и проверка на заполненность вектораВ C++ вектор
push_back() — это встроенный метод, используемый для добавления нового элемента в конец вектора. Он автоматически изменяет размер вектора, если для размещения нового элемента недостаточно места. Стоит отметить, что это не единственный и не основной способ заполнения вектора, но в данном посте мы рассмотрим его как конкретную операцию, в которой проявляется основной паттерн.Обычно, если используется данный метод, реализация в псевдокоде будет выглядеть примерно так:
if (_Mylast == _Myend)
push_back_func();
else
construct(_Mylast, value);
++_Mylast;
Код проверяет, есть ли место для нового элемента в векторе. Если нет, то оно выделяется и элемент добавится в конец вектора. Если есть, значение добавляется по адресу, на который сейчас указывает
_Mylast. Посмотрим в наш пример на скриншоте 4.👀 Видим, что паттерн просматривается. Есть сравнение указателей
_Mylast и _Myend, за которым следует вызов функции sub_140002860, в которую передаются наши указатели и целевое значение. Если мы зайдем в sub_140002860, первое, что мы увидим, будет вычисление размера вектора — size() = (_Mylast - _Myfirst) / sizeof(T) (скриншот 5). То есть функции, чтобы понять, нужно ли выделять новую память, требуется вычислить новый размер вектора и сравнить его с текущей вместимостью. Для нас это подсказка — мы смотрим в функцию push_back.🤝 Теперь, когда понятно, что перед нами вектор, можем воссоздать его структуру (скриншот 6) и структуру, которая его использует, и разметить их в IDA (скриншот 7). Выглядит немного лучше и понятнее.
Несмотря на наличие и других конструкторов и методов у
std::vector, знание его внутреннего расположения в памяти позволяет легко идентифицировать вектор в скомпилированном коде.Stay tuned!
#tip #reverse
@ptescalator (X, Max)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Компания Google сформировала обновление Chrome 147.0.7727.101 с исправлением 31 уязвимости, из которых 5 помечены как критические. Критические проблемы позволяют обойти все уровни защиты браузера и выполнить код в системе за пределами sandbox-окружения. Детали пока не раскрываются, известно лишь, что уязвимости вызваны выходом за границы буфера в прослойке ANGLE (трансляция вызовов OpenGL ES в другие графические API) и библиотеке Skia (отрисовка 2D-графики), а также обращениями к уже освобождённой памяти (Use-after-free) в механизме упреждающей отрисовки (Prerender), компонентах для виртуальной реальности (XR) и реализации Proxy-объектов.
🔗Ссылка:
https://www.opennet.ru/65219/
🔗Ссылка:
https://www.opennet.ru/65219/
Разработчики Composer выпустили обновление, которое устраняет сразу две уязвимости, способные привести к выполнению произвольных команд на машине пользователя. Проблема примечательна тем, что риск затрагивал не только тех, кто работает с Perforce, но и обычные установки Composer, где Perforce вообще не использовался.
Composer — менеджер зависимостей для PHP, который помогает подключать сторонние библиотеки, обновлять пакеты и собирать проект с нужными версиями компонентов. Инструмент широко используют и в небольших веб-приложениях, и в крупных сервисах, поэтому любые проблемы в Composer быстро выходят за рамки одной экосистемы и затрагивают большое число разработчиков и компаний.
🔗Ссылка:
https://www.securitylab.ru/news/571652.php?r=1
Composer — менеджер зависимостей для PHP, который помогает подключать сторонние библиотеки, обновлять пакеты и собирать проект с нужными версиями компонентов. Инструмент широко используют и в небольших веб-приложениях, и в крупных сервисах, поэтому любые проблемы в Composer быстро выходят за рамки одной экосистемы и затрагивают большое число разработчиков и компаний.
🔗Ссылка:
https://www.securitylab.ru/news/571652.php?r=1
Старые уязвимости иногда возвращаются в самый неожиданный момент. Пока Microsoft выпускала апрельский набор обновлений, американское ведомство по кибербезопасности предупредило об атаке через уязвимость в Excel, которой уже 17 лет.
Речь идёт об уязвимости CVE-2009-0238 (оценка по CVSS: 9.3). Управление по кибербезопасности и инфраструктурной безопасности США, CISA, подтвердило, что уязвимость уже используют в реальных атаках. Проблему добавили в каталог известных эксплуатируемых уязвимостей и дали федеральным ведомствам всего две недели на установку обновлений, на неделю меньше обычного срока.
🔗Ссылка:
https://www.securitylab.ru/news/571641.php
Речь идёт об уязвимости CVE-2009-0238 (оценка по CVSS: 9.3). Управление по кибербезопасности и инфраструктурной безопасности США, CISA, подтвердило, что уязвимость уже используют в реальных атаках. Проблему добавили в каталог известных эксплуатируемых уязвимостей и дали федеральным ведомствам всего две недели на установку обновлений, на неделю меньше обычного срока.
🔗Ссылка:
https://www.securitylab.ru/news/571641.php
Обычный веб-сервер может перейти под полный контроль злоумышленника после одного запроса из интернета. Новая уязвимость в популярной панели управления Nginx уже используется в реальных атаках, и для взлома даже не нужен пароль.
Проблема получила идентификатор CVE-2026-33032 (оценка по CVSS: 9.8) и связана с тем, что nginx-ui оставляет без защиты служебный адрес «/mcp_message». Через него любой человек в сети может выполнять команды с повышенными правами без проверки доступа. Речь идёт о действиях, которые напрямую управляют сервером: перезапуске Nginx, изменении или удалении конфигурационных файлов и их автоматической перезагрузке.
🔗Ссылка:
https://www.securitylab.ru/news/571634.php
Проблема получила идентификатор CVE-2026-33032 (оценка по CVSS: 9.8) и связана с тем, что nginx-ui оставляет без защиты служебный адрес «/mcp_message». Через него любой человек в сети может выполнять команды с повышенными правами без проверки доступа. Речь идёт о действиях, которые напрямую управляют сервером: перезапуске Nginx, изменении или удалении конфигурационных файлов и их автоматической перезагрузке.
🔗Ссылка:
https://www.securitylab.ru/news/571634.php
Forwarded from Pentest Notes
Meld-Encrypt: Шифрование файлов и заметок в Obsidian. 👊
Многие специалисты, включая меня, используют Obsidian для ведения своих заметок, в том числе очень даже чувствительных.
И вроде всё хорошо, obsidian удобен, НО! У него до сих пор нет встроенного шифрования и функций безопасности! А существующие плагины не такие классные, как хотелось бы.
Поэтому я сделал форк довольно популярного Obsidian Encrypt и добавил в него функционал, которого лично мне не хватало во время работы.
Что нового по сравнению с оригиналом:
➡️ Появилась поддержка шифрования файлов
➡️ Шифрование всего контента в заметке одним нажатием
➡️ Шифрование директорий
➡️ Удобный просмотр зашифрованного контента
➡️ Улучшенный UI/UX
➡️ Добавлена Русская локализация
➡️ Весь новый функционал также работает и на Android
➡️ Исправлены мелкие недочеты
➡️ Добавлено краткое руководство пользователя
🔒 Для шифрования используется связка PBKDF2 + AES-256-GCM. Главная фишка в том, что заметки всегда будут храниться на диске в зашифрованном виде. Это исключает компрометацию даже при физическом доступе к вашему устройству.
Ссылка на GitHub
💫 @pentestnotes
Многие специалисты, включая меня, используют Obsidian для ведения своих заметок, в том числе очень даже чувствительных.
И вроде всё хорошо, obsidian удобен, НО! У него до сих пор нет встроенного шифрования и функций безопасности! А существующие плагины не такие классные, как хотелось бы.
Поэтому я сделал форк довольно популярного Obsidian Encrypt и добавил в него функционал, которого лично мне не хватало во время работы.
Что нового по сравнению с оригиналом:
🔒 Для шифрования используется связка PBKDF2 + AES-256-GCM. Главная фишка в том, что заметки всегда будут храниться на диске в зашифрованном виде. Это исключает компрометацию даже при физическом доступе к вашему устройству.
Ссылка на GitHub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Dylan's Blog
DSCourier: Weaponizing DSC via WinGet COM API for EDR Evasive Execution
Table of Contents Introduction What is WinGet? WinGet as a PowerShell Execution Proxy The Limitations of Using winget.exe Directly Building YAML Payloads Removing winget.exe from the Equation How the COM API Technique Works The Interop Layer What the Process…
🔗Ссылка:
https://dylansec.com/DSCourier/
https://dylansec.com/DSCourier/