Показать сообщение отдельно
Старый 21.06.2012, 20:55   #9
Specialist
 
Регистрация: 13.06.2012
Сообщений: 25
Репутация: 20
По умолчанию

Как и обещал, раскрутил тему. Написал небольшой модуль ядра, вызывающий write на консоль из кернелспейса. Итак, немного черношляпной вуду-магии
Код:
/*

    Simple kernel module by the Specialist
    Run syscall from the kernel space

*/

#include <linux/module.h> 
#include <linux/uaccess.h> 
#include <asm/unistd.h>

static int __init init(void) 
 { 
	char *str = " ! blackhat v00d00 ;-]\n";
	mm_segment_t fs = get_fs(); 

  	// fs must point to the data segment of the calling process
	set_fs(get_ds()); 
	
	// call write
	asm volatile ("int $0x80": 
		     :"a"(__NR_write), "b"(1), "c"(str), 
		      "d"(strlen(str))); 

	// restore fs
	set_fs(fs); 
	return -1; 
 } 

module_init(init);
А теперь небольшое пояснение. Для нормального выполнения в юзерспейсе, FS должен указывать
на сегмент данных текущего процесса. Что в коде собственно и делается. В реальном эксплойте вместо макросов можно использовать asm-вставки.

upd. Даже не подумал, что проверок uid в сисколлах никто не отменял. Скорее всего прийдётся вызывать нижележащие функции.
Specialist вне форума   Ответить с цитированием