x86 vs x64 de explotación [cerrado]

-3

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?

    
pregunta Shikataganai 20.11.2017 - 03:34
fuente

1 respuesta

1

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.

    
respondido por el guest 20.11.2017 - 08:40
fuente

Lea otras preguntas en las etiquetas