• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья [отладка] Разбираемся с libc раз и на всегда (force binary use custom libc version)

swagcat228

X-pert
Эксперт
Регистрация
23.12.2019
Сообщения
284
Реакции
232
Депозит
300
Привет, Дамага.

Пока разбирался с эксплуатацией HEAP очень часто сталкивался с проблемой версий libc.
libc - либ-си - это специальная библиотека где хранится минимально-необходимое для практически любой программы.
И версий этих библиотек - великое множество. Так вот, что делать, если у нас бинарник, к примеру, с сервера где версия 2.23, а у нас на машине установлена 2.28 ?
Ведь алгоритмы работы аллокатора отличаются, да оффсеты отличаются. Что делать, если мы хотим разрабатывать сплоит сразу под нужную версию?

Для этого существует patchelf. Но в этой статье я расскажу как доделать все до конца так, что бы под деббагером было работать комфортно.

В общем наши действия можно разбиить на следующие пункты:
1. качаем бинарник.
2. качаем нужную версию libc
3. качаем отладочные символы нужной версии libc
4. патчим libc
5. патчим бинарь
6. PROFIT!!!

Теперь подробнее:
1.
1590274394124.png

есть у нас такой вот бинарник. видно, что он приучен к glibc 2.3
Отлично. значит нам подойдёт libc6-2.23.
Я знаю что на том сервере дистрибутив - убунта. так и поступим

2.
идём на офф сайт или архив того дистрибутива который нас интересует и качам нужную версию:
https://packages.ubuntu.com/xenial/amd64/libc6/download - LIBC6-2.23
скачали? распаковываем в любою папку. например 2.23. в ней появится папка data.
(да, мы качаем deb и распаковываем его просто как архив, не нужно его устанавливать, не дай бог)
1590274782861.png

в папке 2.23/data у нас появились бинарные версии libc

3.
https://packages.ubuntu.com/xenial/amd64/libc6-dbg/download - LIBC6-2.23-dbg
что за dbg и зачем они нужны увидем позже.
Пока просто качаем и точно так же распаковываем в папочку 2.23/data/data

1590274900224.png

сделали? замечательно. переходим к пункту 4.

4. тут нужно быть внимательным. иначе придётся всё переделывать.
сперва мы очищаем в либ-си поле, которое хранит информацию об отладочных символах.
Bash:
objcopy -R .gnu_debuglink ./data/libc-2.23.so ⇒ удалить запись об отладочных символах из либы

mv ./data/data/libc-2.23.so ./data/libc-2.23.so.debug ⇒ копируем файл отладочных символов от библиотеки соответствующей версии в папку с кастомной библиотекой.

objcopy --add-gnu-debuglink=libc-2.23.so.debug ./libc-2.23.so ⇒ пишем в сегмет отладочных символов ссылку на файл где отладочные символы
готово. супер.

5.
теперь патчим сам бинарник:
Bash:
patchelf --set-interpreter ld-2.23.so ./binary  ⇒ патчим эльф на новый либц

patchelf --replace-needed libc.so.6 /full/path/to/current/folder/with/libc-2.23.so ./binary ⇒ указываем ельфу где ему брать всё остальные либы
супер!

проверяем:
gdb -q ./chapter1
start
vmmap
1590275324153.png


Теперь об отладочных символах и зачем это нужно.
Допустим, мы хотим проанализировать heap под pwndbg. И мы пишем

heap
vis
в ответ мы получаем сообщение следующего характера:
1590275503582.png

разумеется что мы не будем себе на debian, к примеру, ставить отладочные символы от 2.23 убунтовской libc. Да мы и не сможем этого сделать...
По этому мы обращаемся к пункту 3 и 4
1590275713705.png


Вот как-то так. Теперь работать будет немного удобнее.
До скорого)
 
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх