[Кузница изнутри]
Почему реверс-инженеру нужно знать про релокации и ленивое связывание?
Пишу статью по гибридному анализу (Ghidra + GDB). Нужно было показать читателю, как элегантно работает std::string::_M_dispose() и как на низком уровне определяется, где лежит строка: в куче или на стеке (SSO).
Решил заодно красиво продемонстрировать работу команды stepi в GDB. Ставлю точку останова перед первым вызовом _M_dispose(), делаю шаг внутрь... и попадаю в PLT-заглушку.
Начинается ленивое связывание (lazy binding). Отладчик ныряет в _dl_runtime_resolve, потом в другие функции и мы начинаем тонуть. Я трачу время, теряю нить повествования, раздуваю раздел и увожу читателя от главной сути. Все в минусе.
Нужно было просто поставить точку останова на второй вызов _M_dispose! К тому моменту динамический компоновщик уже разрешит все адреса и я попаду прямиком внутрь нужной мне функции, без лишних посредников.
В динамически слинкованных бинарниках внешние функции не всегда связываются сразу при запуске. Если реверс-инженер не понимает, как работают PLT/GOT и ленивое связывание, его отладка превратится в бесконечное блуждание по заглушкам и отнимет драгоценное время.
Подробнее о релокациях в Linux написал в журнале «Хакер»:
https://xakep.ru/2026/07/08/linux-relocation/
#ХКузница #ХакерскаяКузница #КузницаИзнутри #Linux #ELF #reverse #безопасность
Почему реверс-инженеру нужно знать про релокации и ленивое связывание?
Пишу статью по гибридному анализу (Ghidra + GDB). Нужно было показать читателю, как элегантно работает std::string::_M_dispose() и как на низком уровне определяется, где лежит строка: в куче или на стеке (SSO).
Решил заодно красиво продемонстрировать работу команды stepi в GDB. Ставлю точку останова перед первым вызовом _M_dispose(), делаю шаг внутрь... и попадаю в PLT-заглушку.
Начинается ленивое связывание (lazy binding). Отладчик ныряет в _dl_runtime_resolve, потом в другие функции и мы начинаем тонуть. Я трачу время, теряю нить повествования, раздуваю раздел и увожу читателя от главной сути. Все в минусе.
Нужно было просто поставить точку останова на второй вызов _M_dispose! К тому моменту динамический компоновщик уже разрешит все адреса и я попаду прямиком внутрь нужной мне функции, без лишних посредников.
В динамически слинкованных бинарниках внешние функции не всегда связываются сразу при запуске. Если реверс-инженер не понимает, как работают PLT/GOT и ленивое связывание, его отладка превратится в бесконечное блуждание по заглушкам и отнимет драгоценное время.
Подробнее о релокациях в Linux написал в журнале «Хакер»:
https://xakep.ru/2026/07/08/linux-relocation/
#ХКузница #ХакерскаяКузница #КузницаИзнутри #Linux #ELF #reverse #безопасность
🔥2
Прекрасно понимаю, что иногда лень читать технические лонгриды и хочется просто полистать ленту в Инстаграм*. Поэтому решил его завести и публиковать шпаргалки из своих статей – схемы, картинки, выжимки. Для быстрого чтения и без погружения в портянку деталей.
А если зацепит – полный текст материала всегда найдете по ссылке в описании к записи.
Профиль: https://www.instagram.com/mosesutulin/
*Деятельность организации Meta Platforms Inc, ее продуктов Instagram и Facebook запрещена в Российской Федерации.
А если зацепит – полный текст материала всегда найдете по ссылке в описании к записи.
Профиль: https://www.instagram.com/mosesutulin/
*Деятельность организации Meta Platforms Inc, ее продуктов Instagram и Facebook запрещена в Российской Федерации.
❤1
Когда ты вызываешь sleep() в Linux, программа понятия не имеет, где эта функция лежит в памяти. ASLR каждый раз меняет адрес libc. Как она её находит?
Ответ – релокации, PLT, GOT и ленивая привязка. В этой шпаргалке разложил всё по полочкам:
- Куда на самом деле ведёт call
- Как работает GOT и PLT
- В чём разница между первым и вторым вызовом
- Команды для GDB и objdump
- Lazy vs BIND_NOW
Сохраняй, чтобы не потерять!
Если хочешь увидеть это в GDB шаг за шагом – читай полную статью в журнале Хакер.
vk.cc/cZIocO
#ХКузница #ХакерскаяКузница #linux #gdb #debugging #programming #хакер #релокации #got #plt #linux #objdump #reverse
Ответ – релокации, PLT, GOT и ленивая привязка. В этой шпаргалке разложил всё по полочкам:
- Куда на самом деле ведёт call
- Как работает GOT и PLT
- В чём разница между первым и вторым вызовом
- Команды для GDB и objdump
- Lazy vs BIND_NOW
Сохраняй, чтобы не потерять!
Если хочешь увидеть это в GDB шаг за шагом – читай полную статью в журнале Хакер.
vk.cc/cZIocO
#ХКузница #ХакерскаяКузница #linux #gdb #debugging #programming #хакер #релокации #got #plt #linux #objdump #reverse
Что, если в GOT окажется не адрес из libc, а адрес из вашей библиотеки? Именно так работают userland-руткиты. Прошёл полный путь атакующего: перехват функций (LD_PRELOAD), эксплуатация уязвимости sudo (CVE-2025-32463), установка BEURK и сокрытие /etc/ld.so.preload. А потом обнаружение всего этого через три принципа охоты на руткиты.
Ссылка: https://xakep.ru/2026/08/06/ld-preload-indepth/
Это третья статья из цикла:
1. Как программа попадает в память - https://habr.com/ru/articles/1036444/
2. Релокации. Разбираемся, как Linux-программа находит функцию во время выполнения - https://xakep.ru/2026/07/08/linux-relocation/
3. Userland-руткиты - https://xakep.ru/2026/08/06/ld-preload-indepth/
#ХКузница #ХакерскаяКузница #linux #руткиты #безопасность
Ссылка: https://xakep.ru/2026/08/06/ld-preload-indepth/
Это третья статья из цикла:
1. Как программа попадает в память - https://habr.com/ru/articles/1036444/
2. Релокации. Разбираемся, как Linux-программа находит функцию во время выполнения - https://xakep.ru/2026/07/08/linux-relocation/
3. Userland-руткиты - https://xakep.ru/2026/08/06/ld-preload-indepth/
#ХКузница #ХакерскаяКузница #linux #руткиты #безопасность
Вы запускаете программу, о которой ничего не знаете. Она вежливо просит строку, а в ответ на ваш ввод насмешливо отвечает: «Bro, what are you trying to do?» И правда, что мы пытаемся сделать? Пытаемся понять ее.
Перед нами crackme – программа-головоломка, написанная для тренировки навыков обратной разработки: бинарник под Linux x86-64 без исходников и документации, который издевается над каждым, кто не смог его разгадать. Это первая статья цикла из трех о гибридном анализе крякми Getting Started Keygen (Mazzottis). Мы осмотрим файл штатными утилитами, найдем main в Ghidra, расшифруем «бессмысленные» имена переменных в реальную раскладку стека и подтвердим гипотезы в GDB. По пути встретим оптимизированный пролог без RBP, «хитрое» беззнаковое условие и std::string, спрятавшийся в трех переменных, которые на первый взгляд никак не связаны.
Во второй части цикла – мутационное тестирование и реконструкция скрытой структуры, в третьей – полный разбор хеш-функции и восстановление алгоритма на Python.
Ссылка: https://habr.com/ru/articles/1068160/
Перед нами crackme – программа-головоломка, написанная для тренировки навыков обратной разработки: бинарник под Linux x86-64 без исходников и документации, который издевается над каждым, кто не смог его разгадать. Это первая статья цикла из трех о гибридном анализе крякми Getting Started Keygen (Mazzottis). Мы осмотрим файл штатными утилитами, найдем main в Ghidra, расшифруем «бессмысленные» имена переменных в реальную раскладку стека и подтвердим гипотезы в GDB. По пути встретим оптимизированный пролог без RBP, «хитрое» беззнаковое условие и std::string, спрятавшийся в трех переменных, которые на первый взгляд никак не связаны.
Во второй части цикла – мутационное тестирование и реконструкция скрытой структуры, в третьей – полный разбор хеш-функции и восстановление алгоритма на Python.
Ссылка: https://habr.com/ru/articles/1068160/
Хабр
«Bro, what…?» #1. Первый контакт с crackme на Linux x86-64
Введение Вы запускаете программу, о которой ничего не знаете. Она вежливо просит: «Введите строку». Вы вводите что-то и в ответ получаете насмешливое: «Бро, что ты пытаешься сделать?» И правда, что мы...
🔥3👍1