Пропатчить GOT таблицу на MIPS.
От: fk0 Россия https://fk0.name
Дата: 18.04.15 15:58
Оценка:
Как пропатчить KDE2 под FreeBSD GOT-таблицу на MIPS?

Более практически меня интересует перехватить вызов функции xxx() скажем. При условии, что мой код стартует после загрузки всех .so и линковки. LD_PRELOAD — нельзя.

Т.е. на x86 понятно как. Я беру адрес xxx — он же является адресом внутри PLT, откуда я извлекаю адрес ячейки GOT, в которой записан реальный адрес функции, и подменяю его на свой.

Проблемы MIPS: во-первых нет PLT. В момент вызова функции генерируется код, который сразу лезет в GOT, извлекает адрес, кладёт в t9 и делает jalr t9. Из этого следствие, что непонятно как получить адрес ячейки GOT: если, на уровне ассемблера, я использую символ xxx, например, то команда la xxx мне сразу генерит код лезущий в GOT (оканчивающийся на lw t9, offs(gp)) — и в регистре сразу у меня адрес самой xxx. А мне нужно не значение символа xxx, а адрес ячейки GOT (не адрес функции xxx, а адрес адреса в GOT). И вот здесь я не понимаю — возможно ли, и если возможно то как записать такую конструкцию. Складывается впечатление, что невозможно. Но меж тем задача инжекции своей функции в чужой код она же можно сказать типовая. Должно же быть какое-то решение. Наконец, как-то же это делает линкер, на момент загрузки (хотя, он может читать ELF, а я не очень-то хочу).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.