elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Shellcode no imprime caracter(64 bits)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Shellcode no imprime caracter(64 bits)  (Leído 2,931 veces)
lapras

Desconectado Desconectado

Mensajes: 140



Ver Perfil WWW
Shellcode no imprime caracter(64 bits)
« en: 10 Noviembre 2012, 04:37 am »

Hola, estaba haciendo una shellcode de prueba. Simplemente debe de imprimir el carácter 'w'.
He usado el gdb para comprobar todas la instrucciones y el programa acaba correctamente pero no se por que no imprime el carácter.

Código
  1. #include <stdio.h>
  2. #include <sys/mman.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. int (*sc)();
  7. /****************************************************************
  8. 0000000000000000 <main>:                                         /
  9.   0: 48 31 c9             xor    %rcx,%rcx                  /
  10.   3: 48 31 c0             xor    %rax,%rax                  /
  11.   6: eb 11                 jmp    19 <n>                     /
  12.                                                                  /
  13. 0000000000000008 <et>:                                            /
  14.   8: 59                   pop    %rcx                       /
  15.   9: b0 04                 mov    $0x4,%al                   /
  16.   b: b3 01                 mov    $0x1,%bl                   /
  17.   d: b2 01                 mov    $0x1,%dl                   /
  18.   f: cd 80                 int    $0x80                      /
  19.  11: 48 31 c0             xor    %rax,%rax                  /
  20.  14: 48 ff c0             inc    %rax                       /
  21.  17: cd 80                 int    $0x80                      /
  22.                                                                  /
  23. 0000000000000019 <n>:                                             /
  24.  19: e8 ea ff ff ff       callq  8 <et>                     /
  25.                                                                  /
  26. 000000000000001e <abc>:                                           /
  27. ...                                                           /
  28. ******************************************************************/
  29.  
  30.  
  31.  
  32. char shellcode[] = "\x48\x31\xc9\x48\x31\xc0\xeb\x11\x59\xb0\x04\xb3\x01\xb2\x01\xcd\x80\x48\x31\xc0\x48\xff\xc0\xcd\x80\xe8\xea\xff\xff\xffw";
  33.  
  34. int main(int argc, char **argv) {
  35.  
  36.    char *ptr = mmap(0, sizeof(shellcode),
  37.            PROT_EXEC | PROT_WRITE | PROT_READ, MAP_ANON
  38.            | MAP_PRIVATE, -1, 0);
  39.  
  40.    if (ptr == MAP_FAILED) {
  41.        perror("mmap");
  42.        exit(-1);
  43.    }
  44.  
  45.    memcpy(ptr, shellcode, sizeof(shellcode));
  46.    sc = ptr;
  47.  
  48.    (void)((void(*)())ptr)();
  49.  
  50.    return 0;
  51. }

EI: juntando mensajes.

He corregido algunos posibles errores. Pero sigue sin funcionar.
Tengo que decir que que el código ensamblador(en nasm) funciona pero la shellcode insertada en c no funciona.
Lo que he hecho es añadir los xor por si quedaba basura en los registros y cambiar la llamada a exit() por un ret para que después de la función continúe.

Código
  1. #include <stdio.h>
  2. #include <sys/mman.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. int (*sc)();
  7. /****************************************************************
  8. 0000000000000000 <main>:                                      /
  9.   0: 48 31 c9             xor    %rcx,%rcx              /
  10.   3: 48 31 c0             xor    %rax,%rax              /
  11.   6: eb 13                 jmp    1b <n>                 /
  12.                                                                   /
  13. 0000000000000008 <et>:                                        /
  14.   8: 59                   pop    %rcx                   /
  15.   9: 48 31 c0             xor    %rax,%rax              /
  16.   c: 48 31 db             xor    %rbx,%rbx              /
  17.   f: 48 31 d2             xor    %rdx,%rdx              /
  18.  12: b0 04                 mov    $0x4,%al               /
  19.  14: b3 01                 mov    $0x1,%bl               /
  20.  16: b2 01                 mov    $0x1,%dl               /
  21.  18: cd 80                 int    $0x80                  /
  22.  1a: c3                   retq                          /
  23.                                                              /
  24. 000000000000001b <n>:                                         /
  25.  1b: e8 e8 ff ff ff       callq  8 <et>                 /
  26.                                                              /
  27. 0000000000000020 <abc>:                                       /
  28.  20: 77                   .byte 0x77                    /
  29. ...                                                       /
  30. ******************************************************************/
  31.  
  32.  
  33.  
  34. char shellcode[] = "\x48\x31\xc9\x48\x31\xc0\xeb\x13\x59\x48\x31\xc0\x48\x31\xdb\x48\x31\xd2\xb0\x04\xb3\x01\xb2\x01\xcd\x80\xc3\xe8\xe8\xff\xff\xffw";
  35. //char shellcode[] = "\x48\x31\xc9\x48\x31\xc0\xeb\x11\x59\xb0\x04\xb3\x01\xb2\x01\xcd\x80\x48\x31\xc0\x48\xff\xc0\xcd\x80\xe8\xea\xff\xff\xffw";
  36.  
  37. int main(int argc, char **argv) {
  38.  
  39.    char *ptr = mmap(0, sizeof(shellcode),
  40.            PROT_EXEC | PROT_WRITE | PROT_READ, MAP_ANON
  41.            | MAP_PRIVATE, -1, 0);
  42.  
  43.    if (ptr == MAP_FAILED) {
  44.        perror("mmap");
  45.        exit(-1);
  46.    }
  47.  
  48.    memcpy(ptr, shellcode, sizeof(shellcode));
  49.    sc = ptr;
  50.  
  51.    (void)((void(*)())ptr)();
  52.    printf("\n");
  53.  
  54.    return 0;
  55. }

El código de nasm es el siguiente:
Código
  1. ;EXAMPLE VARIABLES IN LINUX
  2.  
  3.  
  4. global main
  5.  
  6. main:                           ; main
  7.  
  8. xor rcx, rcx            ; eficient way turning register to 0
  9. xor rax, rax            ; exclusive or
  10.  
  11. jmp n            
  12. et:
  13. pop rcx
  14.  
  15. xor rax, rax
  16. xor rbx, rbx
  17. xor rdx, rdx
  18. mov al, 4                      ; Number of system call (write)
  19. mov bl, 1                      ; argument(1=stdout)
  20. mov dl, 1                      ; number of characters
  21. int 0x80
  22.  
  23. ret
  24.  
  25. n:
  26. call et
  27. abc: db 'w'            ; declaring one variable(size 8 bytes)

EI: juntando mensajes.

Bueno, resulta que también pregunté en stackoverflow y al final me contesto a mi mismo.
Podeis ver la respuesta en este hilo: http://stackoverflow.com/questions/13323379/shell-code-print-character64bits


« Última modificación: 10 Noviembre 2012, 19:54 pm por Eternal Idol 7D » En línea

lapras

Desconectado Desconectado

Mensajes: 140



Ver Perfil WWW
Re: Shellcode no imprime caracter(64 bits)
« Respuesta #1 en: 10 Noviembre 2012, 17:37 pm »

Bueno, resulta que también pregunté en stackoverflow y al final me contesto a mi mismo.
Podeis ver la respuesta en este hilo: http://stackoverflow.com/questions/13323379/shell-code-print-character64bits


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines