Dia 12

Capitulo 7 - Auditing program binaries

Un acto de fe

Cada vez que instalas un programa: un salto al vacío lleno de fe:

Ejemplo

¿Qué es una vulnerabilidad?

Veamos algunos ejemplo de los bugs que pueden resultar en vulnerabilidad de programa.

Stack overflow

Ejemplo: digamos que en una función se definen las siguientes variables:

int counter;
char string[8];
float number;

y usamos scanf o gets para pedir al usuario que entre el valor para el string. El usuario entra un nombre de más de 16 caracteres. La parte más nociva es la que tachó al return address. El atacante puede redirigir el flujo del programa a código nocivo.

Si te interesan este tipo de explotaciones

Return to libc

Lab de hoy: return to libc

Auditando y buscando posibles stackoverflows:

Buscar:

Ojo:

Stack checking (previniendo stack overflows)

#include <stdio.h>
int main(int argc, char *argv[]) {
    char st[8];
    gets(st);
    printf("%s\n",st);
    return 0;
}

Disassembly del ejemplo:

00000000004005ed <main>:
  4005ed:       55                      push   %rbp
  4005ee:       48 89 e5                mov    %rsp,%rbp
  4005f1:       48 83 ec 20             sub    $0x20,%rsp
  4005f5:       89 7d ec                mov    %edi,-0x14(%rbp)
  4005f8:       48 89 75 e0             mov    %rsi,-0x20(%rbp)  
  4005fc:       64 48 8b 04 25 28 00    mov    %fs:0x28,%rax     ;// rand value read
  400603:       00 00
  400605:       48 89 45 f8             mov    %rax,-0x8(%rbp)   ;// cookie writen
  400609:       31 c0                   xor    %eax,%eax
  40060b:       48 8d 45 f0             lea    -0x10(%rbp),%rax
  40060f:       48 89 c7                mov    %rax,%rdi
  400612:       e8 d9 fe ff ff          callq  4004f0 <gets@plt>
  400617:       48 8d 45 f0             lea    -0x10(%rbp),%rax
  40061b:       48 89 c7                mov    %rax,%rdi
  40061e:       e8 8d fe ff ff          callq  4004b0 <puts@plt>
  400623:       b8 00 00 00 00          mov    $0x0,%eax
  400628:       48 8b 55 f8             mov    -0x8(%rbp),%rdx   ;// stack cookie read
  40062c:       64 48 33 14 25 28 00    xor    %fs:0x28,%rdx     ;// and compared
  400633:       00 00
  400635:       74 05                   je     40063c <main+0x4f>
  400637:       e8 84 fe ff ff          callq  4004c0 <__stack_chk_fail@plt>
  40063c:       c9                      leaveq
  40063d:       c3                      retq
  40063e:       66 90                   xchg   %ax,%ax

Abusando del heap - Heap overflows

Filtros para strings.

Si la causa de estas vulnerabilidades son los strings. ¿Por qué no poner un filtro que dificulte la entrada de código malicioso? Por ejemplo, convertir el string a Unicode cambiaría cada byte en 2 bytes donde el segundo es 0x00.

Los atacantes se las han ingeniado hasta para producir secuencias que garanticen abuso aun en presencia de filtros: http://bit.ly/4995-unicode-proof-shellcodes

Overflow de enteros

Caso de la vida real de vulnrabilidad en Windows 2000

Causas:

AddExtensionControlBlock(char *st)
   . . .
   push the address of an exception function to the stack
   (in case something goes wrong)

   sub esp, 0x1d0    <- un stack frame ‘grande’
                        para aguantar variable localSt
   . . .
   computa el largo del string st
   lo compara con 0x190 (400 en decimal)
   si es mayor llama a una excepción
   . . .
   llama a DecodeURLEscapes(char *st, unsigned int len, char *localSt,…)
   llama a DecodeHtmlNumeric
   **otras cosas***

DecodeUrlEscapes(char *st):
   for each char in st:
      convert to Unicode, append in st.

Esquema de exploit

[string                      ] <— overflow this!
[saved bp                    ] <— overflow this!
[address of exception handler] <— contaminate with address to your shellcode
[return address              ]