Cargar modulo del kernel Linux.

Iniciado por 0xDani, 22 Noviembre 2012, 17:21 PM

0 Miembros y 1 Visitante están viendo este tema.

0xDani

Hola!

Veran estoy haciendo un pequeño codigo en asm que debe comprobar si se tienen permisos de root y si los tiene cargar un modulo del kernel. Al parecer hay una syscall que lo hace, la 0x31, pero he optado por llamar a la funcion de C(http://www.kernel.org/doc/man-pages/online/pages/man2/init_module.2.html). Tengo dos problemas:

-No se el tamaño de la struct image, y no lo encuentro por ninguna parte.
-No se con que hay que linkar o que hay que hacer para hacer un call a init_module, el assembler (nasm) me dice: 'symbol "init_module" undefined'.

Y en realidad tengo otro, y es que no se si tengo que rellenar la estructura o algo, no hay ejemplos ni nada, pero con eso ya me apaño.

Código (asm) [Seleccionar]

extern init_module
section .text
global _start

_start:

xor eax,eax
add eax,0x31
int 0x80
test eax,eax
jz init

exit:
xor eax,eax
inc eax
xor ebx,ebx
or ebx,eax
int 0x80

init:
xor eax,eax
or eax,80
add eax,48
push image
jmp n
m:
call init_module
jmp exit

n:
call m
name:
db "mylkm.o",0



section .bss

image: resb (tamanio de struct image)


Saludos y gracias de antemano ;D

Edit: Tenia que declarar init_module como extern claro :') Ahora el ensamblador no me dice nada, pero el linker me salta con undefined reference to 'init_module'.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Ferno

#1
Por lo segundo:
Donde está declarada/definida init_module, ¿está declarada como global? Porque si es static en su unidad de compilación no podés referenciarla desde tu programa en assembly.

O bueno, si es posible, incluir la librería linux/module.h

0xDani

Puedo incluir linux/module.h en el programa en assembly? Es decir, puedo incluir headers de C en programas en assembly?
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Ferno


Eternal Idol

Proba con _init_module por el mangling de C y sino el tema es que tenes que pasarle el nombre de la libreria que exporta ese simbolo.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

0xDani

Tampoco funciona con _init_module. Va a ser que no linko con la libreria adecuada.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

cpu2

Hola

Voy a intentar ayudarte, veo algunas cosas mal.

Código (asm) [Seleccionar]

init:
xor eax,eax
or eax,80
add eax,48
push image
jmp n
m:
call init_module
jmp exit

n:
call m
name:
db "mylkm.o",0



section .bss

image: resb (tamanio de struct image)


No hace falta que incluyas ninguna libreria, ya tienes init_module en las llamadas al sistema la 128, cosa que haces con el or y el add, que no lo entiendo no es mejor con mov?

Requiere dos arg, el nombre y la estructura si no me equivoco, y tu metes uno en el stack.

Cita de: 0xDani en 22 Noviembre 2012, 17:21 PM
Y en realidad tengo otro, y es que no se si tengo que rellenar la estructura o algo, no hay ejemplos ni nada, pero con eso ya me apaño.

¿Sabes rellenar una estructura en C?

Creo que es lo mismo.

Un saludo.

P.D: Hice algo parecido a una backdoor, tuve que rellenar la estructura sockaddr_in y la in_addr las quieres de ejemplo, o te quemas la cabeza tú solo?

0xDani

El or y el add los utilizo para que no me queden ceros en la sección .text del binario, porque pensaba utilizarlo como una especie de shellcode.

Los argumentos de la syscall son un puntero a void, un unsigned long y un puntero a char. El unico que se para que sirve es el puntero a char, que son los argumentos que se le pasan al modulo.

Y si, si se rellenar una estructura en C, de hecho es mi primer lenguaje, y ASM esta siendo mi segundo.

En cuanto a lo de la backdoor me vendria genial ver ese codigo, me lio mucho con los sockets en ASM.

Saludos!
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

cpu2

Cita de: 0xDani en 25 Noviembre 2012, 16:43 PM
Los argumentos de la syscall son un puntero a void, un unsigned long y un puntero a char. El unico que se para que sirve es el puntero a char, que son los argumentos que se le pasan al modulo.

La syscall init_module necesita dos argumentos un puntero a char y una estructura que es module si no me equivoco, tienes que rellenar la estructura y copiarla a %ecx creo.

Cita de: 0xDani en 25 Noviembre 2012, 16:43 PM
En cuanto a lo de la backdoor me vendria genial ver ese codigo, me lio mucho con los sockets en ASM.

http://foro.elhacker.net/unixunixlike/ocultar_procesos-t376125.0.html

Un saludo.

0xDani

Mira ahi vienen las syscalls, es la 128: http://syscalls.kernelgrok.com/
Lo que me confunde es el puntero a void, porque por el nombre de los parametros parece que el segundo es el tamaño de la zona de memoria a la que apunta el primero y el tercero los argumentos que se le pasan al modulo.

Gracias por el codigo!

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM