Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: 0xDani en 22 Noviembre 2012, 17:21 pm



Título: Cargar modulo del kernel Linux.
Publicado por: 0xDani en 22 Noviembre 2012, 17:21 pm
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
  1. extern init_module
  2. section .text
  3. global _start
  4.  
  5. _start:
  6.  
  7. xor eax,eax
  8. add eax,0x31
  9. int 0x80
  10. test eax,eax
  11. jz init
  12.  
  13. exit:
  14. xor eax,eax
  15. inc eax
  16. xor ebx,ebx
  17. or ebx,eax
  18. int 0x80
  19.  
  20. init:
  21. xor eax,eax
  22. or eax,80
  23. add eax,48
  24. push image
  25. jmp n
  26. m:
  27. call init_module
  28. jmp exit
  29.  
  30. n:
  31. call m
  32. name:
  33. db "mylkm.o",0
  34.  
  35.  
  36.  
  37. section .bss
  38.  
  39. 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'.


Título: Re: Cargar modulo del kernel Linux.
Publicado por: Ferno en 22 Noviembre 2012, 18:17 pm
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


Título: Re: Cargar modulo del kernel Linux.
Publicado por: 0xDani en 22 Noviembre 2012, 18:27 pm
Puedo incluir linux/module.h en el programa en assembly? Es decir, puedo incluir headers de C en programas en assembly?


Título: Re: Cargar modulo del kernel Linux.
Publicado por: Ferno en 22 Noviembre 2012, 18:42 pm
Con intentar no perdes nada :P


Título: Re: Cargar modulo del kernel Linux.
Publicado por: Eternal Idol en 23 Noviembre 2012, 01:13 am
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.


Título: Re: Cargar modulo del kernel Linux.
Publicado por: 0xDani en 24 Noviembre 2012, 14:07 pm
Tampoco funciona con _init_module. Va a ser que no linko con la libreria adecuada.


Título: Re: Cargar modulo del kernel Linux.
Publicado por: xv0 en 24 Noviembre 2012, 21:17 pm
Hola

Voy a intentar ayudarte, veo algunas cosas mal.

Código
  1. init:
  2. xor eax,eax
  3. or eax,80
  4. add eax,48
  5. push image
  6. jmp n
  7. m:
  8. call init_module
  9. jmp exit
  10.  
  11. n:
  12. call m
  13. name:
  14. db "mylkm.o",0
  15.  
  16.  
  17.  
  18. section .bss
  19.  
  20. 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.

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?


Título: Re: Cargar modulo del kernel Linux.
Publicado por: 0xDani en 25 Noviembre 2012, 16:43 pm
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!


Título: Re: Cargar modulo del kernel Linux.
Publicado por: xv0 en 25 Noviembre 2012, 17:20 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.

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

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

Un saludo.


Título: Re: Cargar modulo del kernel Linux.
Publicado por: 0xDani en 25 Noviembre 2012, 18:42 pm
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.


Título: Re: Cargar modulo del kernel Linux.
Publicado por: xv0 en 26 Noviembre 2012, 18:58 pm
Mira esta tabla:

Código:
http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

Verás que requiere lo que te dije anteriormente, para salir de dudas busca la syscall en syscall.h, hay te dira los arg que requiere.

Código:
/usr/include/sys/syscall.h

El primero es el nombre del módulo creo, el segundo es la estructura te puedes guiar con las de mi código.

Un saludo.


Título: Re: Cargar modulo del kernel Linux.
Publicado por: 0xDani en 27 Noviembre 2012, 16:01 pm
Esa tabla de syscalls es para el kernel 2.2 Ademas sigo sin encontrar por ninguna parte el tamaño de la estructura image.

Gracias por la ayuda y saludos.