Muchos de los textos que he examinado parecen estar basados en procesadores de 32 bits. ¿Qué tan diferente es la inversión de 32 bits y 64 bits? ¿Es fácil recoger las cosas de 64 bits si aprendo las cosas de 32 bits?
Muchos de los textos que he examinado parecen estar basados en procesadores de 32 bits. ¿Qué tan diferente es la inversión de 32 bits y 64 bits? ¿Es fácil recoger las cosas de 64 bits si aprendo las cosas de 32 bits?
Supongo que para x86 y x64 te refieres a i386 y amd64, respectivamente.
Explotación
Esta es una pregunta muy compleja. Al menos para x86, el comportamiento general de los procesadores de 32 y 64 bits es bastante similar. Los conceptos básicos son los mismos (es decir, ROP no es una bestia significativamente diferente en uno u otro). La principal diferencia es que los procesadores de 64 bits suelen tener instrucciones más nuevas y, por supuesto, tienen registros que son el doble de grandes. Aún puede usar registros de 32 bits en un procesador de 64 bits (por ejemplo, mov eax,32
funciona en ambos procesadores, mientras que mov rax,32
solo funciona en 64 bits). Muchas veces verás programas de 64 bits que utilizan todo tipo de instrucciones y registros, e incluso algo como mov al,32
es perfectamente válido. Una explicación útil de eso se da aquí .
Hay algunas diferencias sutiles cuando se trata de comportamiento de bajo nivel. Un procesador de 64 bits se ejecuta en modo largo, mientras que un procesador de 32 bits se limita al modo protegido. Esto hace que cosas como la segmentación de la memoria no estén disponibles en la primera. Sin embargo, esto no suele importar cuando se trata de la explotación de aplicaciones básicas.
El comportamiento del sistema operativo también puede ser diferente. Hay algunos syscalls diferentes, con diferentes comportamientos, en Linux de 32 bits en comparación con Linux de 64 bits. Es posible que una vulnerabilidad en el código específico de 32 bits no esté presente en Linux de 64 bits (por ejemplo, una vulnerabilidad en el vm86()
syscall). Del mismo modo, las bibliotecas del sistema pueden comportarse de manera ligeramente diferente entre los dos. También hay diferentes formas de invocar syscalls. En sistemas de 32 bits, utiliza una interrupción, llamada como int 0x80
. En sistemas de 64 bits, hay una instrucción syscall
más rápida, que genera una excepción en lugar de una interrupción.
Ingeniería inversa
También pregunta si RE es muy diferente (RE está separado de la explotación). Sí, es un poco diferente, pero solo en eso hay nuevas instrucciones y registros. Un desensamblador podrá mostrarle qué es qué. Habrá muchas vistas familiares, incluso si todo lo que has usado es un antiguo 8086 (ya que ax
y al
son registros perfectamente válidos). Sin embargo, hay algunas diferencias no tan obvias, como una acción en un registro de 32 bits que borra la mitad superior del registro equivalente de 64 bits.
Además, hay algunos registros más de propósito general. Esto significa que puede ver instrucciones como xchg rax,r12
. Sin embargo, tienen versiones de 32 bits, a pesar de que solo se han agregado en sistemas de 64 bits, donde reciben nombres como r12d
.
Desmontaje de un mundo de saludo de 64 bits:
hello64: file format elf64-x86-64
Disassembly of section .text:
0000000000400080 <_start>:
400080: b8 01 00 00 00 mov eax,0x1
400085: bf 01 00 00 00 mov edi,0x1
40008a: 48 8d 34 25 a4 00 40 lea rsi,ds:0x4000a4
400091: 00
400092: ba 0e 00 00 00 mov edx,0xe
400097: 0f 05 syscall
400099: b8 3c 00 00 00 mov eax,0x3c
40009e: 31 ff xor edi,edi
4000a0: 0f 05 syscall
Contents of section .rodata:
4000a4 48656c6c 6f2c2077 6f726c64 210a Hello, world!.
Desmontaje de un mundo de saludo de 32 bits:
hello32: file format elf32-i386
Disassembly of section .text:
08048060 <_start>:
8048060: b8 04 00 00 00 mov eax,0x4
8048065: bf 01 00 00 00 mov edi,0x1
804806a: 8d 35 80 80 04 08 lea esi,ds:0x8048080
8048070: ba 0e 00 00 00 mov edx,0xe
8048075: cd 80 int 0x80
8048077: b8 01 00 00 00 mov eax,0x1
804807c: 31 ff xor edi,edi
804807e: cd 80 int 0x80
Contents of section .rodata:
8048080 48656c6c 6f2c2077 6f726c64 210a Hello, world!.
Takeaway
Si ya conoce la explotación o la ingeniería inversa, migrar a un sistema de 64 bits será fácil.
Lea otras preguntas en las etiquetas reverse-engineering