Ayuda con código mutante C

Iniciado por NeoB, 19 Septiembre 2012, 19:30 PM

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

NeoB

Buenas. He estado esta tarde mirando como es eso de "el código mutante" (cade vez me suena mejor xD) pero al intentar reproducir el ejemplo de esta dirección: http://usuarios.multimania.es/rllopis/mainMutante.html me quedo pillado en que al crear el fichero .c con la función mutante() al hacer el objdump -s me sale:

$ gcc -c mutante.c -o mutante.o
$ objdump -s mutante.o


mutante.o:     file format elf64-x86-64

Contents of section .text:
0000 554889e5 b8010000 005dc3             UH.......].    
Contents of section .comment:
0000 00474343 3a202855 62756e74 752f4c69  .GCC: (Ubuntu/Li
0010 6e61726f 20342e36 2e332d31 7562756e  naro 4.6.3-1ubun
0020 74753529 20342e36 2e3300             tu5) 4.6.3.    
Contents of section .eh_frame:
0000 14000000 00000000 017a5200 01781001  .........zR..x..
0010 1b0c0708 90010000 1c000000 1c000000  ................
0020 00000000 0b000000 00410e10 8602430d  .........A....C.
0030 06460c07 08000000                    .F......    

No se que cojer... también he intentado con hexdump -S pero tampoco se que parte es.
He probado con el código de la web sin modificar y me sale una "violación de segmento core generado".
Además mi máquina es de 64bits, supongo que eso influye en los valores hexadecimales, no¿?
Alguna ayuda¿?

Fire544

#1
Este tema fue tratado en temas anteriores en el foro, favor repasarlo no dan una solucion pero explican fijate http://foro.elhacker.net/programacion_cc/puntero_a_funcion-t370480.0.html se dice que !!! --> "Se crea un puntero a funcion, que no devuelve ningun valor y que no recibe nada. Sino que solamente se alteran los valores del vector desde una misma variabla o sea se accede con el mismo vector, y solamente se visualiza con el puntero a funcion, cosa que tambien se podria hacer con el vector". Bueno esto es todo !!   :xD
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

NeoB

Ok. Gracias! y perdón por re-postear...

NeoB

No se si debería haber empezado otro tema pero creo que es una tontería empezar otro... haber si alguien me responde o ayuda a alguien:
Averigüé como conseguir las instrucciones en código máquina (probaba con "objdump -s", pero depués de leer el man, ví que era "objdump -d") y lo hice como me ponía en http://usuarios.multimania.es/rllopis/mainMutante.html... no funcionaba en mi ordenador, busqué por que, vi que era por que la zona en la que guardaba el código (el array de char), no tenía permisos de ejecución, busqué como dárselos, ví que tenía que usar "sys/mmap.h", la usé, y... ME FUNCIONÓ!
Este es el código (el que me funciona):

/*
-Escribe el código de la función en un archivo de texto.
-Compila la función con "gcc -c file.c".
-Usa "objdump -d file.o" para ver el código máquina.
*/

#include <sys/mman.h>
#include <string.h>

int main ()
{
int (*ptf)();
unsigned char *code; // <---- Contiene el código máquina de una función que retorna 5 (el código lo da objdump).

code = mmap(0,sizeof(code), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0);

code[0] = 0x55;
code[1] = 0x48;
code[2] = 0x89;
code[3] = 0xe5;
code[4] = 0xb8;
code[5] = 0x05; // <---- Lo que devuelve la función. Lo mutaremos más adelante.
code[6] = 0x00;
code[7] = 0x00;
code[8] = 0x00;
code[9] = 0x5d;
code[10] = 0xc3;

ptf = code;
printf("Antes de mutar: %d\n", ptf());

code[5] = 0x06;

printf("Después de mutar: %d\n", ptf());
return 0;
}

Mi duda es si lo de "sizeof(code)" está bien siendo code ¿un array dinámico, no?.

systemfirst97

mmm e analizado todo el codigo y no encuentro la finalidad del mismo alguien me puede decir me perdi en las localidades de memoria