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


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Escribir en archivos con file descriptors introduce caracteres extraños
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Escribir en archivos con file descriptors introduce caracteres extraños  (Leído 3,476 veces)
nullx100

Desconectado Desconectado

Mensajes: 5



Ver Perfil
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.


« Última modificación: 23 Abril 2022, 12:17 pm por nullx100 » En línea

nullx100

Desconectado Desconectado

Mensajes: 5



Ver Perfil
Re: Escribir en archivos con file descriptors introduce caracteres extraños
« Respuesta #1 en: 23 Abril 2022, 14:07 pm »

Creo que se por donde van los tiros.
Con la herramienta hexdump he analizado la nota y veo que el user id si que esta, pero está invertido debido al little endian y como en memoria se guarda inverso pasa al archivo de forma inversa también.


En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Escribir en archivos con file descriptors introduce caracteres extraños
« Respuesta #2 en: 23 Abril 2022, 17:22 pm »

Es cierto que x86/x64 son little endian, pero eso no es lo que causa tu problema. Los editores de texto y el comando cat esperan un archivo de texto, pero en la línea

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

estás escribiendo un valor entero en el archivo. Obviamente si se intenta leer como ASCII o UTF-8, se van a mostrar símbolos raros. Necesitas convertir userid a texto, por ejemplo, mediante sprintf o snprintf, y luego guardar esa cadena resultante.

Tienes otro error importante. Los elementos de argv son punteros, no arrays. Así, esto:

Código
  1.  databuffer = (char *) ec_malloc(sizeof(argv[1]));

está mal, pues sizeof devolverá el tamaño de un puntero (4 u 8), por lo que si el mensaje no cabe en esa cantidad de bytes, estarás sobrescribiendo bytes indebidos. Lo que necesitas pasar a ec_malloc es: "strlen(argv[1]) + 1".
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
caracteres extraños
Programación Visual Basic
mariana_87 6 3,243 Último mensaje 24 Marzo 2009, 13:42 pm
por mariana_87
Duda con caracteres extraños
PHP
Shell Root 4 3,706 Último mensaje 1 Octubre 2011, 19:33 pm
por Carluís
¿Qué diablos es esto!? (Archivos con caracteres extraños y sin ruta en firewall)
Seguridad
WallMaster 1 2,236 Último mensaje 30 Junio 2013, 06:34 am
por Randomize
Caracteres Extraños ñ
Desarrollo Web
bgnumis 2 2,218 Último mensaje 1 Marzo 2015, 20:43 pm
por MinusFour
caracteres extraños FPDF error
PHP
bgnumis 4 6,378 Último mensaje 5 Julio 2015, 17:31 pm
por MinusFour
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines