Привет, Дамага.
Пока разбирался с эксплуатацией HEAP очень часто сталкивался с проблемой версий libc.
libc - либ-си - это специальная библиотека где хранится минимально-необходимое для практически любой программы.
И версий этих библиотек - великое множество. Так вот, что делать, если у нас бинарник, к примеру, с сервера где версия 2.23, а у нас на машине установлена 2.28 ?
Ведь алгоритмы работы аллокатора отличаются, да оффсеты отличаются. Что делать, если мы хотим разрабатывать сплоит сразу под нужную версию?
Для этого существует patchelf. Но в этой статье я расскажу как доделать все до конца так, что бы под деббагером было работать комфортно.
В общем наши действия можно разбиить на следующие пункты:
1. качаем бинарник.
2. качаем нужную версию libc
3. качаем отладочные символы нужной версии libc
4. патчим libc
5. патчим бинарь
6. PROFIT!!!
Теперь подробнее:
1.
есть у нас такой вот бинарник. видно, что он приучен к glibc 2.3
Отлично. значит нам подойдёт libc6-2.23.
Я знаю что на том сервере дистрибутив - убунта. так и поступим
2.
идём на офф сайт или архив того дистрибутива который нас интересует и качам нужную версию:
https://packages.ubuntu.com/xenial/amd64/libc6/download - LIBC6-2.23
скачали? распаковываем в любою папку. например 2.23. в ней появится папка data.
(да, мы качаем deb и распаковываем его просто как архив, не нужно его устанавливать, не дай бог)
в папке 2.23/data у нас появились бинарные версии libc
3.
https://packages.ubuntu.com/xenial/amd64/libc6-dbg/download - LIBC6-2.23-dbg
что за dbg и зачем они нужны увидем позже.
Пока просто качаем и точно так же распаковываем в папочку 2.23/data/data
сделали? замечательно. переходим к пункту 4.
4. тут нужно быть внимательным. иначе придётся всё переделывать.
сперва мы очищаем в либ-си поле, которое хранит информацию об отладочных символах.
готово. супер.
5.
теперь патчим сам бинарник:
супер!
проверяем:
Теперь об отладочных символах и зачем это нужно.
Допустим, мы хотим проанализировать heap под pwndbg. И мы пишем
в ответ мы получаем сообщение следующего характера:
разумеется что мы не будем себе на debian, к примеру, ставить отладочные символы от 2.23 убунтовской libc. Да мы и не сможем этого сделать...
По этому мы обращаемся к пункту 3 и 4
Вот как-то так. Теперь работать будет немного удобнее.
До скорого)
Пока разбирался с эксплуатацией HEAP очень часто сталкивался с проблемой версий libc.
libc - либ-си - это специальная библиотека где хранится минимально-необходимое для практически любой программы.
И версий этих библиотек - великое множество. Так вот, что делать, если у нас бинарник, к примеру, с сервера где версия 2.23, а у нас на машине установлена 2.28 ?
Ведь алгоритмы работы аллокатора отличаются, да оффсеты отличаются. Что делать, если мы хотим разрабатывать сплоит сразу под нужную версию?
Для этого существует patchelf. Но в этой статье я расскажу как доделать все до конца так, что бы под деббагером было работать комфортно.
В общем наши действия можно разбиить на следующие пункты:
1. качаем бинарник.
2. качаем нужную версию libc
3. качаем отладочные символы нужной версии libc
4. патчим libc
5. патчим бинарь
6. PROFIT!!!
Теперь подробнее:
1.
есть у нас такой вот бинарник. видно, что он приучен к glibc 2.3
Отлично. значит нам подойдёт libc6-2.23.
Я знаю что на том сервере дистрибутив - убунта. так и поступим
2.
идём на офф сайт или архив того дистрибутива который нас интересует и качам нужную версию:
https://packages.ubuntu.com/xenial/amd64/libc6/download - LIBC6-2.23
скачали? распаковываем в любою папку. например 2.23. в ней появится папка data.
(да, мы качаем deb и распаковываем его просто как архив, не нужно его устанавливать, не дай бог)
в папке 2.23/data у нас появились бинарные версии libc
3.
https://packages.ubuntu.com/xenial/amd64/libc6-dbg/download - LIBC6-2.23-dbg
что за dbg и зачем они нужны увидем позже.
Пока просто качаем и точно так же распаковываем в папочку 2.23/data/data
сделали? замечательно. переходим к пункту 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 ./chapter1startvmmap
Теперь об отладочных символах и зачем это нужно.
Допустим, мы хотим проанализировать heap под pwndbg. И мы пишем
heapvisв ответ мы получаем сообщение следующего характера:
разумеется что мы не будем себе на debian, к примеру, ставить отладочные символы от 2.23 убунтовской libc. Да мы и не сможем этого сделать...
По этому мы обращаемся к пункту 3 и 4
Вот как-то так. Теперь работать будет немного удобнее.
До скорого)
Последнее редактирование: