Перехват библиотечных функций в linux и bsd


         

Инъекция кода - часть 2


Простейшая подпрограмма генерации относительного вызова выглядит так:

unsigned char buf_code[]={0xE8, 0x0, 0x0, 0x0,0x0}; // call 00000h

call_r(char *lib_name, char *from, char *to, int delta)

{

       unsigned char *base, *from, *to;

      

       base = dlopen(lib_name,RTLD_NOW); if (!base) return -1;

       from = dlsym(base,from); if (!from) return -1;

       to   = dlsym(base,to); if (!to) return -1;

      

       *((unsigned int*)&buf_code[1]) = to - from - sizeof(buf_code) - delta;

       return 666;

}

Листинг 8 подпрограмма генерирует относительный вызов и помещает его в глобальный буфер buf_code, lib_name – имя хакаемой библиотеки, from – имя функции, из которой будет осуществляться вызов (например, gets), to – имя функции, которую нужно вызывать (например, write), delta – смещение инструкции call от начала thunk-кода

Функция call_r вызывается из программы-инсталлятора (например, нашей mem.c) и генерирует относительный вызов call по адресу from на адрес to. Она может использоваться для вызова любых функций, а не только _dl_addr.

Модернизируем программу mem.c и отпатчим функцию gets так, чтобы она выводила символ "*" на экран. Мы будем вызывать функцию write из библиотеки libc со следующими параметрами: write(1,&"*",1). Обратите внимание на конструкцию &"*" — мы заталкиваем в стек символ "*" и передаем функции его указатель. А что еще остается делать? Сегмент данных ведь недоступен! Приходится использовать стек! При желании туда можно затолкать не только один символ, но и ASCIIZ-строку (только не забудьте потом вытолкнуть обратно — некоторые забывают, в результате чего имеют несбалансированный стек и получают segmentation fault).

// начало thunk-кода

// заталкиваем в стек аргументы функции write,

// но саму функцию еще не вызываем, т.к. не знаем ее адреса

unsigned char buf_pre[]={  0x6A,0x2A,    /* push 2Ah   */

                           0x8B,0xDC,    /* mov ebx,esp       */




Содержание  Назад  Вперед