Здравствуйте все.
я пытаюсь получить уровень 0 в линуксе на ассемблере,
но поскольку я ламер и не знаю английского - я не могу нормально понять доки по заражению елф(хочу заразить ядро без потери его функциональности).
мне советовали написать модуль к ядру - но я не знаток C/C++, сейчас понемногу изучаю.
боольшая просьба всем тем - у кого есть свободное время и знания C/C++ или Gnu_as - выложить здесь или скинуть на proglammer@inbox.ru код получения уровня 0 на асме(не под виндовс!), или код ЛЮБОГО модуля ядра(2.4-18.3) для линукса(ну пусть он хоть хелло выводит) который можно скомпилить gcc-2.96-110.большая просьба - дайте код и всё. не надо писать "зайди на коденет.ру там все есть".
заранее ОХРЕНЕННОЕ спасибо всем кто сможет помочь.
и извиняюсь - но отвечать здесь кому либо смогу нескоро т.к. вкалываю грузчиком и времени ОЧЕНЬ мало.
в качестве платы за вашу щедрость моду дать поюзать мой hex - редактор, ом довольно сырой(пишу часика по два в день, когда не сплю и не работаю :) ).
вот он - leaker.narod.ru/hewr.rarтакже буду благодарен всем кто даст ссылки на русские хелпы по ELF формату.
господи... не "моду" а могу, и не "ом" а он.
>господи... не "моду" а могу, и не "ом" а он.
Ага. А я ставлю пиво тому, кто мне объяснит, что такое ring0 в линуксе.
mymodule.c
--->
#define __KERNEL__
#define MODULE#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>static int mymodule_init() {
printk("hello,world\n");
return 0;
}static void mymodule_done() {
}module_init();
module_exit();--->
gcc -I/lib/modules/`uname -r`/build include mymodule.c -o mymodule.o -c
--->
Если хочешь получить ассемблерный код, то замени "-c" на "-s". :)
Пардон "-c" на "-S", конечно же.
gcc -I/lib/modules/`uname -r`/build include mymodule.c -o mymodule.o -c
выдает: "gcc: cannot specify -o with -c or -S and multiple compilations"
----------
gcc -I/lib/modules/`uname -r`/build mymodule.c -o mymodule.o -c
выдает:
In file included from mymodule.c:5:
/usr/include/linux/module.h:60: parse error before `atomic_t'
/usr/include/linux/module.h:60: warning: no semicolon at end of struct or union
/usr/include/linux/module.h:60: warning: no semicolon at end of struct or union
/usr/include/linux/module.h:62: parse error before `}'
/usr/include/linux/module.h:62: warning: data definition has no type or storage class
/usr/include/linux/module.h:91: parse error before `}'
----------
закомментил
union
{ atomic_t usecount;
long pad;
} uc;
в module.hgcc выдал:
/tmp/ccaA55N7.s: Assembler messages:
/tmp/ccaA55N7.s:38: Error: missing expression
/tmp/ccaA55N7.s:40: Error: missing expressionя так понял - у меня говеный glibc-kernheaders*rpm ?
или что?
>gcc -I/lib/modules/`uname -r`/build include mymodule.c -o mymodule.o -cgcc -I/lib/modules/`uname -r`/build/include mymodule.c -o mymodule.o -c
Спасибо! :) совсем отупел я от работы, пора увольнятся.
но тут загвоздка:
теперь
gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o mymodule.o -c
выдает:
/tmp/ccQKp19t.s: Assembler messages:
/tmp/ccQKp19t.s:38: Error: missing expression
/tmp/ccQKp19t.s:40: Error: missing expression
--------
я сделал так
gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o mymodule.o -S
и исправил строчки 38/40
с .set init_module,
.globl cleanup_module
.set cleanup_module,на .set init_module,0
.globl cleanup_module
.set cleanup_module,1
и попытался скомпилить
вот что выдал ld
ld: warning: cannot find entry symbol _start; defaulting to 08048074
a.out: In function `mymodule_init':
a.out(.text+0xf): undefined reference to `printk':(
>>gcc -I/lib/modules/`uname -r`/build include mymodule.c -o mymodule.o -c
>
>gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o mymodule.o -cЧё, Murr, на пиво заработать решил?
:-))
ну-ну
:) !!!!!
спасибо пиплы!
допер! радости полные штаны блин!!!!всего-то
gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o 0.s -S
-----------------------0.s:
.set init_module,0
.globl cleanup_module
.set cleanup_module,0
-----------------------
gcc -I/lib/modules/`uname -r`/build/include 0.s -o mymodule.o -cвсе работает - вот тока insmod выдает:
Warning: loading mymodule.o will taint the kernel: no licenseкак от этого избавится а?
ну все! разобрался.
короче для всех ламеров вроде меня выкладываю сл. код:
файл mymod.c
------------------------------
#define __KERNEL__
#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#define DRIVER_AUTHOR "автор модуля"
#define DRIVER_DESC "описание модуля"static int __init init_fisrt_mod(void)
{
printk(KERN_ALERT "Hello, world!\n");
return 0;
}static void __exit cleanup_fisrt_mod(void)
{
printk(KERN_ALERT "Goodbye, world.\n");
}module_init(init_fisrt_mod);
module_exit(cleanup_fisrt_mod);MODULE_LICENSE("GPL");
/*
*эта хрень не дает insmod-у выводить:
Warning: loading mymodule.o will taint the kernel: no license
*/а то что ниже я пока не пробовал
// MODULE_AUTHOR(DRIVER_AUTHOR); /* Автор модуля */
// MODULE_DESCRIPTION(DRIVER_DESC); /* Назначение модуля */
---------------------------------
чтобы это скомпилить должен быть установлен kernel-source*.rpm
компилить так:
gcc -I/lib/modules/`uname -r`/build/include mymod.c -o mymod.o -c
---------------------------------
а те кто в С/С++ ноль, а в асме крут - делают так:gcc -I/lib/modules/`uname -r`/build/include mymod.c -o 0.s -S
#дальше редактируем файл 0.s:
#и компилим дальше
gcc -I/lib/modules/`uname -r`/build/include 0.s -o mymod.o -cблин ну и долго`ж я мудился....
>ну все! разобрался.
>короче для всех ламеров вроде меня выкладываю сл. код:
>файл mymod.c
>------------------------------
>#define __KERNEL__
>#define MODULE
>#include <linux/module.h>
>#include <linux/kernel.h>
>#include <linux/init.h>
>#define DRIVER_AUTHOR "автор модуля"
>#define DRIVER_DESC "описание модуля"
>
>static int __init init_fisrt_mod(void)
>{
> printk(KERN_ALERT "Hello, world!\n");
> return 0;
>}
>
>static void __exit cleanup_fisrt_mod(void)
>{
> printk(KERN_ALERT "Goodbye, world.\n");
>}
>
>module_init(init_fisrt_mod);
>module_exit(cleanup_fisrt_mod);
>
>MODULE_LICENSE("GPL");
>/*
>*эта хрень не дает insmod-у выводить:
>Warning: loading mymodule.o will taint the kernel: no license
>*/
>
>а то что ниже я пока не пробовал
>// MODULE_AUTHOR(DRIVER_AUTHOR); /* Автор модуля */
>// MODULE_DESCRIPTION(DRIVER_DESC); /* Назначение модуля */
>---------------------------------
>чтобы это скомпилить должен быть установлен kernel-source*.rpm
>компилить так:
>gcc -I/lib/modules/`uname -r`/build/include mymod.c -o mymod.o -c
>---------------------------------
>а те кто в С/С++ ноль, а в асме крут - делают
>так:
>
>gcc -I/lib/modules/`uname -r`/build/include mymod.c -o 0.s -S
>#дальше редактируем файл 0.s:
>#и компилим дальше
>gcc -I/lib/modules/`uname -r`/build/include 0.s -o mymod.o -c
>
>блин ну и долго`ж я мудился....Да ты уже гуру в вопросе написания модулей для ядра =)
>Да ты уже гуру в вопросе написания модулей для ядра =):)
нее до гуру мне оччень далеко...
я в осносном asm мучаю, и вообщем еще один вопрос - как из модуля запустить программу.
я хотел через execve("/bin/prog");, execl и т.д. но во первых -
insmod выдает:
mymod.o: unresolved symbol execve
и во вторых ведь при execve код вызвавшегоо процесса перезапишется, а ето лажа...
ну а с fork-ом я конкретно обломался, как только вызвал - ядро повисло.
а попытавшись сделать execve через асм
pushl $0x7672732f #/srv - запускаемая прога
movl %esp,%ebx
movl $11,%eax
xorl %ecx,%ecx
xorl %edx,%edx
int $0x80
опять обломался - ничего не произошло....
>pushl $0x7672732f #/srv - запускаемая прогаСтроки должны быть 0-завершенные. В ядре используются ASCIIZ строки.
>movl %esp,%ebx
>movl $11,%eax
>xorl %ecx,%ecx
>xorl %edx,%edx
>int $0x80
>опять обломался - ничего не произошло....В ядре нужно быть очень аккуратным при попытках из ядра делать вещи, завязанные на контекст текущего процесса/нити. К тому же, не забывай, что если ты дергаешь ядреные функции не напрямую, а через intx80, то ты тем самым портишь стек ядра (если ты сделаешь это из init функции, то модуль не завершит инициализацию).
>В ядре нужно быть очень аккуратным при попытках из ядра делать вещи,
>завязанные на контекст текущего процесса/нити. К тому же, не забывай, что
>если ты дергаешь ядреные функции не напрямую, а через intx80, то
>ты тем самым портишь стек ядра (если ты сделаешь это из
>init функции, то модуль не завершит инициализацию).а из какой функции это делать?("main(){}"?), как вызывать функции напрямую,
и как можно запустить прогу не испортив стек ядра?
хочется знать все и сразу. :)ставлю виртуальную бутылку пива всем участникам беседы. :)
>>В ядре нужно быть очень аккуратным при попытках из ядра делать вещи,
>>завязанные на контекст текущего процесса/нити. К тому же, не забывай, что
>>если ты дергаешь ядреные функции не напрямую, а через intx80, то
>>ты тем самым портишь стек ядра (если ты сделаешь это из
>>init функции, то модуль не завершит инициализацию).
>
>а из какой функции это делать?("main(){}"?), как вызывать функции напрямую,
>и как можно запустить прогу не испортив стек ядра?
>хочется знать все и сразу. :)
>
>ставлю виртуальную бутылку пива всем участникам беседы. :)
static void call(void* dummy){
int rv;
static char * envp[] = { "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
char *argv[] = { "/sbin/watchdog", NULL };
rv = call_usermodehelper(argv[0],argv,envp,0);
// можно что-нибудь сделать с rv...
}static DECLARE_WORK(work,call,0);
void func() // где-то внутри модуля
{
schedule_work(&work);
}static void __exit fini(void) // при выгрузке модуля
{
flush_scheduled_work();
}Код для 2.6, в 2.4 немного по-другому... В прошлом году мне на Lor подсказали, для iptables расширение писал, там и для 2.4 пример остался...
>Код для 2.6, в 2.4 немного по-другому...
а у меня какраз 2.4-18.3
да и скомпилить не получилось :(
асм всетаки проще...
и в модуле всего 2-е функции чтоли?(__init и __exit)
я попробовал между ними " main(){ printk(KERN_ALERT "work.\n");} " вставить,
и ничего не вышло.
блин из меня программер как из горбачева балерина.
а "Lor" это что за форум? - я на lor.ru зашел так это сайт оториноларингологии! оказался :)
>>Код для 2.6, в 2.4 немного по-другому...
>а у меня какраз 2.4-18.3
>да и скомпилить не получилось :(
>асм всетаки проще...
>и в модуле всего 2-е функции чтоли?(__init и __exit)
>я попробовал между ними " main(){ printk(KERN_ALERT "work.\n");} " вставить,
>и ничего не вышло.
>блин из меня программер как из горбачева балерина.
>а "Lor" это что за форум? - я на lor.ru зашел так
>это сайт оториноларингологии! оказался :)1) Почитайте литературу по ядру линукса, хотя бы вот это:
http://jamesthornton.com/linux/lkmpg/2) lor == linux.org.ru
Вот ссылка на нужный тред:
http://www.linux.org.ru/profile/majordomo//view-message.jsp?...
см. сообщение от idle 20.04.2004 18:09:13, да и вообще вес тред познавательный 8)
>блин из меня программер как из горбачева балерина.Вы бы для начала почитали хоть какую-нить плохонькую теорию, представление получили, над чем вообще работаете. А то всё это сильно напоминает шаманские пляски с бубном под мухоморами.
Вот, например, замечательная книжка Морриса Баха,"Архитектура ОС UNIX"
http://coolsoft.ru/lib/unix.txt.tgz( смотреть можно так: tar zxfO unix.txt.tgz | less )
И вообще, завязывайте с линухом возюкаться - это мода, впустую время потратите.
ИМХО
beastie.ru
>1) Почитайте литературу по ядру линукса, хотя бы вот это:
>http://jamesthornton.com/linux/lkmpg/
я совершенно не знаю английского.
а на lor сходил - хелпов там куча, буду читать.> И вообще, завязывайте с линухом возюкаться - это мода, впустую время
>потратите.
> ИМХО
>beastie.ru
книжку ессно скачал и буду читать.
а про linux/unix споров много - на вкус и цвет товарищей нет.
>>1) Почитайте литературу по ядру линукса, хотя бы вот это:
>>http://jamesthornton.com/linux/lkmpg/
>я совершенно не знаю английского.Это не кошерно. Самые интересные доки как обычно не на русском 8)
Посмотрите еще вот это:
http://www.opennet.me/openforum/vsluhforumID3/4560.html
>Посмотрите еще вот это:
>http://www.opennet.me/openforum/vsluhforumID3/4560.html:)
а вот по русски - это дело! буду читать ессно!
Спасиба всем! а именно Murr-у majordomo и Link-у!
> Чё, Murr, на пиво заработать решил?
>
> :-))
>
> ну-ну
На пиво мне в отличие от некоторых и зарплаты хватает.
Насчет того кода - руки решил размять.