Autor
|
Tema: Cargar modulo del kernel Linux. (Leído 8,019 veces)
|
0xDani
Desconectado
Mensajes: 1.077
|
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. 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 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'.
|
|
« Última modificación: 22 Noviembre 2012, 17:26 pm por 0xDani »
|
En línea
|
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
Desconectado
Mensajes: 375
|
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
|
|
« Última modificación: 22 Noviembre 2012, 18:22 pm por Ferno »
|
En línea
|
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
Puedo incluir linux/module.h en el programa en assembly? Es decir, puedo incluir headers de C en programas en assembly?
|
|
|
En línea
|
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
Desconectado
Mensajes: 375
|
Con intentar no perdes nada
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
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.
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.077
|
Tampoco funciona con _init_module. Va a ser que no linko con la libreria adecuada.
|
|
|
En línea
|
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
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
Hola Voy a intentar ayudarte, veo algunas cosas mal. 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. 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?
|
|
|
En línea
|
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
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!
|
|
|
En línea
|
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
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
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.
http://foro.elhacker.net/unixunixlike/ocultar_procesos-t376125.0.html Un saludo.
|
|
|
En línea
|
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
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.
|
|
|
En línea
|
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
|
|
|
|
|