Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Войти
 
Страницы: 1
RSS
kvm
 
Как при помощи kvm записать в память ядра (куда именно?) свою ф-цию?
ОС - FreeBSD.
 
Долго и нудно курим все маны по kvm*.
Затем смотрим <a href=http://www.itsx.com/hal2001/fbsdfun.htm rel="nofollow" target="_blank">сюда</a> и thc Про attacking freebsd with lkm(или kld - не помню по буквам) ради наблюдения за примерами работы.   
Далее..  
так понимаю все идет к набившей аскомину замене syscall...
Вообще писать в устройство памяти /dev/kmem подручными средствами(тобишь чисто средствами симейства функций kvm) - вещь достаточно трудная(читай за*бистая), поэтому для начала нужно позволить userspace(ring3) аллоцировать память ядра себе. Решение заключается в 2-х способах: с использованием kld и алгоритмом Silvio Cesare. В первом не вижу практического смысла так как в данном случае при подмене syscallа подразумевается обход запрещения пдгрузки kld - отсюда имхо он интересе чисто с принципиальной точки зрения. Второй же предусматривает получение адреса сисколла затем вызова ф-ии аллоцирования содержимого памяти, после чего сохранение размера нашей ф-ии размером с заменяемый syscall, далее перезапись заменяемого syscall-a нашей функцией, использование всего этого восстановаоение...
короче берем вот это
Код
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x55"&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*   push&nbsp;&nbsp;&nbsp;%ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\xba\x01\x00\x00\x00"&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*   mov&nbsp;&nbsp;&nbsp;&nbsp;$0x1,%edx&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x89\xe5"&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;/*  mov&nbsp;&nbsp;&nbsp;&nbsp;%esp,%ebp&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x53"&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*   push&nbsp;&nbsp;&nbsp;%ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x83\xec\x14"&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;/*  sub&nbsp;&nbsp;&nbsp;&nbsp;$0x14,%esp&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x8b\x5d\x0c"&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;/*  mov&nbsp;&nbsp;&nbsp;&nbsp;0xc(%ebp),%ebx&nbsp;&nbsp;&nbsp;& nbsp;&nbsp;*/
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x8b\x03"&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;/*  mov&nbsp;&nbsp;&nbsp;&nbsp;(%ebx),%eax&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x85\xc0"&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;/*  test&nbsp;&nbsp;&nbsp;%eax,%eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x75\x0b"&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;/* jne&nbsp;&nbsp;&nbsp;&nbsp;20 <kmalloc+0x20>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x83\xc4\x14"&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;/*  add&nbsp;&nbsp;&nbsp;&nbsp;$0x14,%esp&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x89\xd0"&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;/*  mov&nbsp;&nbsp;&nbsp;&nbsp;%edx,%eax&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x5b"&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*   pop&nbsp;&nbsp;&nbsp;&nbsp;%ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;*/
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\xc9"&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*   leave&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\xc3"&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*   ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb sp;*/
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x8d\x76\x00"&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;/*  lea&nbsp;&nbsp;&nbsp;&nbsp;0x0(%esi),%esi&nbsp;&nbsp;&nbsp;& nbsp;&nbsp;*/
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\xc7\x44\x24\x08\x01\x00\x00" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*   movl&nbsp;&nbsp;&nbsp;$0x1,0x8(%esp)&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x00"
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\xc7\x44\x24\x04\x00\x00\x00" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*   movl&nbsp;&nbsp;&nbsp;$0x0,0x4(%esp)&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x00"
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x8b\x00"&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;/*  mov&nbsp;&nbsp;&nbsp;&nbsp;(%eax),%eax&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x89\x04\x24"&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;/*  mov&nbsp;&nbsp;&nbsp;&nbsp;%eax,(%esp)&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\xe8\xfc\xff\xff\xff"&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*  call&nbsp;&nbsp;&nbsp;36 <kmalloc+0x36>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x89\x45\xf8"&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;/*  mov&nbsp;&nbsp;&nbsp;&nbsp;%eax,0xfffffff8(%ebp)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;*/
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\xc7\x44\x24\x08\x08\x00\x00" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*   movl&nbsp;&nbsp;&nbsp;$0x8,0x8(%esp)&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x00"
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x8b\x03"&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;/*  mov&nbsp;&nbsp;&nbsp;&nbsp;(%ebx),%eax&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x89\x44\x24\x04"&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*   mov&nbsp;&nbsp;&nbsp;&nbsp;%eax,0x4(%esp)&nbsp;&nbsp;&nbsp;& nbsp;&nbsp;*/
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x8d\x45\xf4"&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;/*  lea&nbsp;&nbsp;&nbsp;&nbsp;0xfffffff4(%ebp),%eax&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;*/
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x89\x04\x24"&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;/*  mov&nbsp;&nbsp;&nbsp;&nbsp;%eax,(%esp)&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\xe8\xfc\xff\xff\xff"&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*  call&nbsp;&nbsp;&nbsp;52 <kmalloc+0x52>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x83\xc4\x14"&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;/*  add&nbsp;&nbsp;&nbsp;&nbsp;$0x14,%esp&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x89\xc2"&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;/*  mov&nbsp;&nbsp;&nbsp;&nbsp;%eax,%edx&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x5b"&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*   pop&nbsp;&nbsp;&nbsp;&nbsp;%ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;*/
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\xc9"&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*   leave&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\x89\xd0"&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;/*  mov&nbsp;&nbsp;&nbsp;&nbsp;%edx,%eax&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\xc3";&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*   ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb sp;*/

потом во что-то вроде поинтера типа kvm_t делаем kvm_openfiles() ...инициализировав kernel virtual memory access ищем требуемые адреса, выщитываем требуемые смещения и подставляем в нужные байты кода, потом kvm_read() по смещению к сисколлу и сохраняем функцию оригинал, затем kvm_write() туда-же размером не больше и не меньше тем что там было . если все правильно. вызываем наш аллокатор, перезаписываем,  пользуем, восстанавливаем C kvm_write() все по местам, закрываем(kvm_close()).
 
>Долго и нудно курим все маны по kvm*.
уже ;)

>Про attacking freebsd with lkm
Доку от стефани читал

>так понимаю все идет к набившей аскомину замене syscall...
Скажем тогда уж "модификации" (иначе нах через квм делать). Нет не совсем так - нужно просто записать в память ядра свою ф-цию. Например такую как _pf_test_tcp. Вопрос в том по какому адресу ее писать? Сисколы то менять просто.
 
Цитата
Скажем тогда уж "модификации" (иначе нах через квм делать).
Раз уж на то пошло, то в _нашем_ случае с аллоцированием и записью в /dev/kmem средствами libkvm, больше подходит таки "замена", т.к. в конечном счете все сводится к _замене_ того что было тем что мы хотим, а термин "модификация"(видоизменение) - не совсем то, т.к. syscall в конечном итоге замещается новым, а не видоизменяется...ну лана, хрен с ним с толковым словарем...
Цитата
Вопрос в том по какому адресу ее писать?
AFAIK так нельзя(не, в ring0 все можно конечно, но...). libkvm записывает директом в память ядра. Число syscall-ов строго определено и запись _новых_ соответственно не подразумевается. даже взять max_offset, дойти до конца и попытаться перезаписать, то запись уже будет происходить в другую kernel page, разделители итп, что скорее всего привндет к page fault ядра.
Но если так хочется развратиться добавь свой сисколл, в сорцы, собери ядро, а потом пиши в его место: хотя это совсем порно...
ps:почему обязательно libkvm и новый syscall, почему не kld, какие вообще приктические цели?
 
>Раз уж на то пошло, то в _нашем_
Лень читать - глюканутый форум попоротил твой код. Вобще черещ квм имеет смысл тока _модифицировать_ сисколы. Иначе - изврат. Ну да забили на это.

>Число syscall-ов строго определено и запись _новых_ соответственно не подразумевается.
новый сискол прикрутить - как два пальца без пересборки ядра - как через клд так и через квм. Тока изврат это имхо для подобной цели.

>ps:почему обязательно libkvm и новый syscall, почему не kld, какие вообще приктические цели?
А я про сисколы грил? Если чего то сказал - извиняюсь. В общем нашел я технику как через клд заменить ф-цию :) Вопрос решен, спасибо за посильную помощь и отзывчивость apple.
Страницы: 1
Читают тему