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


         

FF 25 AC 98 04


08048374h: FF 25 AC 98 04 08 68 10 00 00 00 E9 C0 FF FF FF

08048384h:FF 25 B0 98 04 08 68 18 00 00 00 E9 B0 FF FF FF

08048394h:FF 25 B4 98 04 08 68 20 00 00 00 E9 A0 FF FF FF

080483A4h:00 00 00 00 00 00 00 00 00 00 00 00 31 ED 5E 89

080483B4h:E1 83 E4 F0 50 54 52 68 90 86 04 08 68 30 86 04

base libc.so.6:400179E8h

400179E8h:00 C0 02 40 D8 79 01 40 30 B5 15 40 6C 66 01 40

400179F8h:88 77 01 40 10 7C 01 40 00 00 00 00 30 B5 15 40

40017A08h:80 B5 15 40 78 B5 15 40 50 B5 15 40 58 B5 15 40

40017A18h:60 B5 15 40 00 00 00 00 00 00 00 00 00 00 00 00

40017A28h:68 B5 15 40 70 B5 15 40 40 B5 15 40 48 B5 15 40

40017A38h:38 B5 15 40 00 00 00 00 00 00 00 00 98 B5 15 40

glsym(,"gets"):4008CE60h

4008CE60h:55 89 E5 57 56 53 83 EC 2C 8B 75 08 E8 AC 4D FB

4008CE70h:FF 81 C3 AF E7 0C 00 C7 45 E0 00 00 00 00 8B 93

4008CE80h:5C 9C FF FF 0F B7 02 25 00 80 FF FF 66 85 C0 75

4008CE90h:0E 8B 83 34 02 00 00 85 C0 0F 85 07 01 00 00 0F

4008CEA0h:B7 02 25 00 80 FF FF 66 85 C0 0F 84 E3 00 00 00

4008CEB0h:8B 42 04 3B 42 08 0F 83 C8 00 00 00 0F B6 08 40

Листинг 4 результат работы программы get_addr

Указатель на функцию gets, судя по адресу (08048364h), смотрит на секцию .plt, то есть находится во "владениях" текущего процесса. Первые байты функции равны FFh 25h A8h 98h 04h 08h, что соответствует команде JMP [080498A8h]. Выходит, это еще не сама функция, а только переходник к ней! Адрес 080498A8h хранится в двойном слове лежащим в глобальной таблице смещений (got). Модификация plt/got обеспечивает перехват функции лишь в пределах текущего процесса, что с одной стороны очень даже хорошо, но с другой — весьма хреново.

Базовый адрес библиотеки libc (400179E8h) лежит в непосредственной близости от истинного адреса функции gets (4009CE60h), возвращаемым dlsym. В глаза сразу же бросается классический пролог 55h/89h E5h (PUSH EBP/MOV EBP,ESP), который мы и будем патчить для перехвата, но сперва разберемся как работать с /dev/mem.


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