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

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / Deshabilitar proceccion de buffer overflow con gcc en: 29 Abril 2022, 22:19 pm
Hola.

Estoy usando lo siguiente:

Ubuntu 32 bits version ubuntu1~16.04.12
GCC 5.4.0.

Estoy tratanto de simular un stack overflow a mi propio programa para sobreescribir la memoria con un payload y abrir una shell.

El caso es que creo que consigo hacerlo pero parece que gcc me compila con proteccion de stack activada.

Buscando por internet he encontrado lo siguiente:

Código:
gcc -fno-stack-protector <file> -o <output-file> 

Lo he usado pero sigue sin deshabilitarme la proteccion.

Sabes alguna otra forma?

El resultado de la ejecucion es:

Código:
*** stack smashing detected ***: ./bufferOverflow terminated
Aborted (core dumped)

2  Programación / Programación C/C++ / Escribir en archivos con file descriptors introduce caracteres extraños en: 23 Abril 2022, 11:54 am
He realizado un programa que mediante un descriptor de archivos escribe en el archivo /tmp/note el mensaje que se le ha pasado como argumento + el id de usuario que ejecuta el programa.

El programa se ha probado a ejecutar como un usuario con el id 1000 y con root (id 0). En ninguno de los dos consigo que se escriba de forma correcta. En el primer caso muestra caracteres raros y en el segundo al ser 0 el id de root me parece que lo toma como un caracter de fin de string y no escribe nada.

Código:
LIbreria customfunctions.h

// A function to print an error message and exit

void fatal(char *message) {
  char error_message[100];

  strcpy(error_message, "[!!] FATAL ERROR ");
  strncat(error_message, message, 83);
  perror(error_message);
  exit(-1);

}

void *ec_malloc(unsigned int size){
  void *ptr;

  ptr = malloc(size);

  if(ptr == NULL)
    fatal("in ec_malloc() on memory allocation.\n");

  return ptr;
}

void usage(char *prog_name, char *filename){
  printf("Usage: %s <text to add to %s>\n", prog_name, filename);
  exit(0);
}






Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "customfunctions.h"


int main(int argc, char *argv[]){

  int userid, fd;
  char *databuffer, *notefile;

  databuffer = (char *) ec_malloc(sizeof(argv[1]));
  strcpy(databuffer, argv[1]);

  notefile = (char *) ec_malloc(sizeof("/tmp/note"));
  strcpy(notefile, "/tmp/note");

  if(argc < 2)
    usage(argv[0], notefile);

  printf("[DEBUG] buffer @ %p: \'%s\'\n", databuffer, databuffer);
  printf("[DEBUG] datafile @ %p: \'%s\'\n", notefile, notefile);
  strncat(databuffer, "\n", 1); //Add a newline at the end

  fd = open(notefile, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR);
  if(fd == -1 )
    fatal("in main() when opening file");

  printf("[DEBUG] file descriptor is %d\n", fd);

  userid = getuid(); //Obtiene el id del usuario que lo ejecuta

  if(write(fd, &userid, sizeof(int)) == -1 )
    fatal("in main() while writing userid to file");

  printf("[DEBUG] Address: %p - User id: %i \n", &userid, userid);

  if(write(fd, "\n", 1) == -1)
    fatal("in main() when writing blank line");

  if(write(fd, databuffer, strlen(databuffer)) == -1 )
    fatal("in main() when writing in file");

  if(write(fd, "\n", 1) == -1)
    fatal("in main() when writing blank line");

  if(close(fd) == -1)
    fatal("in main() when closing file");

  free(databuffer);
  free(notefile);

  return 0;
}


No tengo mucha soltura con gdb pero lo he intentado.

He puesto un breakpoint antes de la linea

if(write(fd, &userid, sizeof(int) == -1)...

Muestro la pila

Código:
(gdb) backtrace full
#0  main (argc=2, argv=0xbffff0c4) at ./notes.c:35
        userid = 1000
        fd = 3
        databuffer = 0x804b008 "test\n"
        notefile = 0x804b018 "/tmp/note"
(gdb)



El resultado de la ejecución es el siguiente:
Código:
superdog@ubuntu:~/home/superdog$ cat /tmp/note
�
message

message2

Alguna idea de lo que esta mal?

Thanks.
3  Programación / Programación C/C++ / Asignar memoria con malloc() en C en: 17 Abril 2022, 19:46 pm
Hola.

Entiendo que las diferentes variables dependiendo del tipo y desde donde se estén declarando se guardan en un segmento de memoria o en otro.

Corregidme si me equivoco

[Direcciones más pequeñas]
--
.text (Para instrucciones)
.data (Para variables globales y estáticas inicializadas)
.bss (Para variables globales y estáticas no inicializadas)
.heap (Uso libre para el programador. Crece hacia direcciones más altas)
.stack (Para guardar el contexto de función, variables locales, parámetros y dirección de retorno para el EIP. Crece en direcciones más pequeñas)
--
[Direcciones más altas]

He creado el siguiente codigo:

Código:

#include <stdio.h&gt;
#include <stdlib.h&gt;

int global_var; //.bss
int global_initialized_var = 5; //.data

void function(){
int stack_var; //Se metera en la pila.
printf("The function's stack_var is at address %p\n", &stack_var);
}

int main(){
int stack_var; // en la pila
static int static_initialized_var = 5; //en .data
static int static_var; //.bss
int *heap_var_ptr; //.heap
heap_var_ptr = (int *) malloc(4);

//.data segment
printf(".data segment\n");
printf("global_initialized_var is at address %p\n", &global_initialized_var);
printf("static_initialized_var is at address %p\n", &static_initialized_var);

//.bss segment
printf(".bss segment\n");
printf("static_var is at address %p\n", &static_var);
printf("global_var is at address %p\n", &global_var);

//.heap segment
printf(".heap segment\n");
printf("heap_var_ptr is at addres %p\n",heap_var_ptr);

//.stack segment
printf(".stack segment\n");
printf("stack_var is at address %p\n", &stack_var);
function();
}


y la salida es la siguiente:

Código:

.data segment
global_initialized_var is at address 0x804a028
static_initialized_var is at address 0x804a02c
.bss segment
static_var is at address 0x804a034
global_var is at address 0x804a038
.heap segment
heap_var_ptr is at addres 0xbfe204e8
.stack segment
stack_var is at address 0xbfe204e4
The function's stack_var is at address 0xbfe204c8


Lo que me extraña es la variable heap_var_ptr, no es raro que este a solo 4 bytes de la de stack_var?? Me da la impresión de que esta variable se está quedando en el segmento de pila en vez de en el de heap cosa que vería normal si fuera otro tipo de variable, ya que está dentro de la función main() pero al usar malloc() me parece raro que no esté en otra dirección de memoria más baja.

Gracias de antemano.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines