LINUX.ORG.RU

segmentation fault (core dumped) .so

 , ,


0

3

Нужна помощь, я патчу определённый адрес через самописный плагин .so, который подругружает программа, мне нужно с помощью моего плагина изменить адрес в данной программе, но какой бы я адрес не изменил, я получаю Segmentation fault (core dumped). Если кто-то работал с изменением памяти у процессов в линуксе, укажите, в чем ошибка.

Скриншот адреса: снизу видно что его оффсет 0x8DD0B

https://i.stack.imgur.com/7FMHL.png

Таким кодом я изменяю:

mprotect((void*)0x8DD0B, 0x1, PROT_READ | PROT_WRITE);
unsigned char pp[1] = { 0xD3 };
memcpy((void*)0x8DD0B, pp, 0x1);

Ответ на: комментарий от demka122

Почему-то я тебе не верю. В мануале явно написано, что addr must be aligned to a page boundary. Проверяй на ошибки свой вызов mprotect, скорее всего ядро тебе уже и так сказало, что с твоим кодом не так, ты просто это проигнорил.

Еще: оффсет ты я надеюсь в мемори дампе смотришь, а не в самом бинаре? ASLR выключил?

Oxd34d10cc ()
Ответ на: комментарий от Oxd34d10cc

я не буду иметь возможности отключить ASLR, я патчу игровой запуск сервера, который будет находится на хостинге и кроме плагина я ни как не смогу взаимодействовать.

demka122 ()

0x8DD0B

Откуда такая уверенность, что данные всегда будут располагаться по этому адресу?

Скорее всего, Вам придётся распарсить /proc/self/maps, обойти каждый из найденных там диапазонов в поисках нужной последовательности байт и только после этого её менять, по совсем другому адресу.

Ещё можно попробовать scanmem, но это совсем другой приём.

anonymous ()

Хз что это на картинке и откуда взялось. Но если предположить, что это бинарь, а не дамп памяти, то нужно смотреть по каким RVA мапится тот регион, что ты собрался патчить, и в рантайме смотреть куда замапилась база.

0x8DD0B (с хардкодом) – это конечно возможно, но выглядит маловерятно.

В любом случае, надо смотреть что вернул mprotect, и пытаться что-то писать, только в случае успеха.

vasily_pupkin ★★★★★ ()
Ответ на: комментарий от demka122

Хорошо, тогда округляйте аргумент mprotect до sysconf(_SC_PAGE_SIZE), как советовали выше. Должно получиться.

Можете привести /proc/$pid/maps для запущенного samp03svr? Интересно, какой секции какого символа этот адрес соответствует.

anonymous ()
Ответ на: комментарий от demka122

Увы тебе. Читай про /proc/[pid]/maps в man proc, узнаешь куда твой 8dd0b в памяти процесса попал.

anonymous ()
Ответ на: комментарий от demka122

Пожалуйста, пользуйтесь средствами разметки Markdown или LORCODE и размещайте текстовые данные напрямую внутри сообщений между строк, состоящих из ```. Либо используйте сервис http://paste.org.ru/ и его аналоги. Текст скриншотом - неуважение к собеседникам.

anonymous ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.