LINUX.ORG.RU

Структура elf header, Shared Object hook и symbol lookup

 , , ,


0

2

Доброго ВС!

Файл first.c

#include <stdio.h>

void firsh(void)
{
printf("First function...\n");
}

собран _> gcc ./first.c -fPIC -shared -o libfirst.so

main.c

int
main(int argc, char **argv)
{
  firsh();  
}
собран _> gcc maic.c ./libfirst.so

./a.out Выводит First function...

Теперь я изменяю first.c (название функции firsh стало first)

#include <stdio.h>

void first(void)
{
printf("First function...\n");
}

Предварительно переименовав libfirst.so в libfirsh.so, собираю libfirst.so еще раз

Тоесть в директории у меня находятся файлы

libfirst.so 
libfirsh.so 
a.out 
main.c 
first.c

Затем открываю hexEditor и меняю в файле libfirst.so названия first на firsh (их будет 2: symtab и dynsym). Пытаюсь выполнить

#./a.out
./a.out: symbol lookup error: ./a.out: undefined symbol: firsh

Ок смотрим, чем отличаются libfirst.so и libfirsh.so: 1) ID сборки по адресу 0x472 2) 512,514,548 байты

От ID сборки результат выполнения никак не зависит. Методом тыка определяю, что за работоспособность программы отвечают 512 и 548 байты: У меня в libfirsh.so было 0x512=0x8A 0x548=0x81

libfirst.so: 0x512=0x88 0x548=0x8D

После изменения даных байтов в libfirst.so на те, что находятся в libfirsh.so

# ./a.out 
First function...

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

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

Вероятно кроме изменения имени нужно ещё пересчитать хеш таблицу которая используется для ускорения лукапа. См.

readelf -S libfirst.so | grep hash

anonymous ()

reverse engineering ... у мамкиных хацкеров не принято документацию читать?

anonymous ()

К сказанному выше: если нужно перехватить вызов функции между проприетарным экзешником и проприетарной либой в виде so, то в линуксе это можно сделать без танцев с хекс-редактором под бубен. Смотри LD_PRELOAD.

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от anonymous

Вот и она:

# echo -n "first" | ./gnu_hash 
val = 0xf704b8d
# echo -n "firsh" | ./gnu_hash 
val = 0xf704b81

Благодарю... мамкин хацкер пошел курить man elf.

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

Дело в том, что при перехвате dlsym таким способом теряется возможность вызова оригинальных функций (dlsym теряется после ее замещения). Поэтому я пытаюсь найти оперативный способ пропатчить dlfcn: изменить имя dlsym, чтобы она осталась доступной для перехватывающей библиотеки.

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

Очень похоже. На самом деле решений этой задачи немало. На худой конец ptrace никто не запрещал...однако сначала попытаюсь прокатится на своем велосипеде, а дальше... как поедет =)

cyber_eagle ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.