Ensamblador
Pablo Garaizar Sagarminaga
Copyleft, all rights reversed
Introducción
¿Para qué vale saber programar en ensamblador?
Optimización
en cuanto a tamaño.
en cuanto a velocidad de ejecución (desenrollado
de bucles, sin redundancias, etc.).
Modificación de binarios (no tenemos el código
fuente):
adaptación de drivers
cracking
virus
Pablo Garaizar Sagarminaga
Copyleft, allrights reversed
Ensamblador en UNIX
Llamadas al sistema (syscalls):
Pablo Garaizar Sagarminaga
Copyleft, all rights reversed
Ensamblador en UNIX
Llamadas al sistema (syscalls):
Normalmente los programas no hacen syscalls,
llaman a funciones de la libC:
...
push string
call printf
...
Programa en C
printf:
...
...
...
int 80h
libC
KERNEL
Núcleo
Pablo Garaizar Sagarminaga
Copyleft, allrights reversed
Ensamblador en UNIX
Llamadas al sistema (syscalls):
Diferentes maneras de utilizarlas en Linux, BSD, etc:
open(path, flags, mode);
Linux
FreeBSD
open:
mov eax,
mov ebx,
mov ecx,
mov edx,
int 80h
syscall:
int 80h
ret
open:
push dword mode
push dword flags
push dword path
mov eax, 05h
call syscall
05h
path
flags
mode
Pablo Garaizar Sagarminaga
Copyleft, all rights reversedEnsamblador en UNIX
Diferentes sintaxis para programar:
Intel: nasm
operación destino, fuente: mov eax, 05h
AT&T: gas, as
operación fuente, destino: movl $0x05, %eax
Sufijos en los opcodes (l(ong), w(ord), b(byte))
indicando el tamaño de los operandos.
Los registros han de ir precedidos de “%” y los literales
de “$”.
Diferencias en referencias:
mov edx, [ebp+ecx*4+040000000h] =
movl$0x4000000(%ebp,%ecx,4), %edx
Pablo Garaizar Sagarminaga
Copyleft, all rights reversed
Primer programa con nasm
section .text
global _start
msg db 'Hello, world!',0Ah
len equ $ - msg
_start:
mov edx,len
mov ecx,msg
mov ebx,1
mov eax,4
int 80h
mov eax,1
int 80h
nasm –f elf hello.asm –o hello.o
ld hello.o –o hello
Pablo Garaizar Sagarminaga
Copyleft, all rights reversed
Ensamblar y enlazar
Ensamblado y enlazado:Ensamblar con nasm:
nasm –f elf fichero.asm –o fichero.o
Enlazado:
ld:
ld -s --dynamic-linker /lib/ld-linux.so.2
-lc fichero.o -o fichero
gcc:
gcc fichero.o -o fichero
Pablo Garaizar Sagarminaga
Copyleft, all rights reversed
Demostración
Programar un "hola, mundo!" con nasm.
Ensamblarlo y enlazarlo.
Ejecutarlo.
Pablo Garaizar Sagarminaga
Copyleft, all rights reversed
Programando en GNU/LinuxEstructura de un programa con nasm:
section .bss: datos sin inicializar:
temporal
resb 255
section .data: datos inicializados:
contador db 0Ah (
contador EQU 0Ah)
zerobuf: times 64 db 0
section .text: código del programa
mov eax, 01h
...
Pablo Garaizar Sagarminaga
Copyleft, all rights reversed
Programando en GNU/Linux
Condiciones iniciales:
Registros
En kernels > 2.2: todos los registros a0.
En kernels < 2.2: ebp y ecx distintos de 0.
Pila:
[esp] = argc
[esp+4] = argv[0]
[esp+8] = argv[1]
...
[esp+n*4] = envp
Pablo Garaizar Sagarminaga
Copyleft, all rights reversed
Programando en GNU/Linux
Estructura de un ejecutable en GNU/Linux (ELF):
Pablo Garaizar Sagarminaga
Copyleft, all rights reversed
Herramientas disponibles
Editores:
BIEW, HTE, ELFe...
Volcadores:
od, objdump,ELFDump...
Desensambladores:
IDA (desde dosemu/wine), LDasm, DCC, Monodis,
jad...
Depuradores:
GDB, Fenris, PrivateICE, front-ends de GDB...
Trazadores:
ltrace, strace, gccchecker...
Pablo Garaizar Sagarminaga
Copyleft, all rights reversed
BIEW
BIEW:
Interfaz intuitivo, similar al HIEW o MC.
Múltiples vistas: binario, octal,
hexadecimal, desensamblado.
Análisis de la cabecera de los ELF.
Modificaciónsencilla del binario.
Pablo Garaizar Sagarminaga
Copyleft, all rights reversed
Demostración
Abrir un ejecutable con BIEW.
Analizar sus secciones y cabeceras.
Desensamblarlo.
Editarlo.
Comprobar el cambio en su funcionamiento.
Pablo Garaizar Sagarminaga
Copyleft, all rights reversed
GDB
GNU Debugger, escrito inicialmente por Richard
Stallman.
Orientado al debugging durante el desarrollo de...
Regístrate para leer el documento completo.