Reconstrucción de Código. Joxean Koret

Documentos relacionados
Fundamentos de Ingeniería Inversa Joxean Koret

Calendario Académico año Introducción a la Programación I

Exploiting... Stack Based Buffer Overflow

Práctica 1. Introducción a la programación en ensamblador

Tema: Lenguaje ensamblador embebido

Los números naturales y enteros en el 80X86 y en LAN

ARREGLOS, PUNTEROS Y ASIGNACIÓN DINÁMICA DE MEMORIA

Introducción al lenguaje C

Pila / Convención C / Interacción C-ASM. Ejercicios. Pila. Organización del Computador II. 21 de marzo de 2017

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Objetivo. Introducción. Tema: GENERACION DE CODIGO. Compiladores, Guía 11 1

Sentencias de control de flujo

Un. VI. Generador de código intermedio.

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

Uso avanzado de punteros

PRÁCTICA # 2. 0 Direcciones 1 Dirección 2 Direcciones 3 Direcciones

Tema 3. Estructuras de control

Unidad VI Generación de Código Intermedio. M.C. Juan Carlos Olivares Rojas

Lectura y escritura de un caracter

Unidad II Fundamentos de C++ M.C. Juan Carlos Olivares Rojas

Repaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE)

Construyendo Programas más Complejos

Autor: Ing. Nahuel González INTRODUCCIÓN A C. Clase 1

Taller de Lenguajes I

1. Presentación del lenguaje C Creado en 1972 por D. Ritchie Lenguaje de propósito general Portátil o transportable (generalmente) Inicialmente de niv

FUNCIONES. Identificador valido. Tipo-Funcion Identificador_de_la_funcion (Tipo par1,tipo par2 )

Elementos de un programa en C

Arquitectura IA-32 Pila. Autor:Alejandro Furfaro

GENERACIÓN DE CÓDIGO INTERMEDIO EJEMPLOS PARA DISTINTAS ESTRUCTURAS DE DATOS

(3) Unidad 3. Interfaz del ensamblador con el lenguaje C SISTEMAS BASADOS EN MICROPROCESADORES. Grado en Ingeniería Informática EPS - UAM

"Binary Diffing" visual en Linux con Radare2 "UNA IMAGEN DICEN MÁS QUE MIL PALABRAS"

Soluciones de los ejercicios sobre Algorítmez

2.2 Nombres, Ligado y Ámbito

Operadores aritméticos

Unidad II: Análisis semántico

Introducción al lenguaje C

Introducción al lenguaje C

DEPARTAMENTO TECNOLOGIA EN ELECTRONICA FUNDAMENTOS DE PROGRAMACION CÓDIGO

Algoritmo, Estructuras y Programación I Ing. Marglorie Colina

ESTRUCTURA SECUENCIAL ESTRUCTURA SELECTIVA

Programación I Funciones

Introducción a Funciones

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

Programación Estructurada. Sesión 2:El lenguaje de programación C

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Tema 18: Memoria dinámica y su uso en C

Fundamentos PHP. El término puntuación nos referimos a la sintaxis usada en PHP para la terminación de una línea de código (;)

Programación Estructurada

LENGUAJE C PARA SISTEMAS DEDICADOS

fundamentos de programación (unidad 4) programación estructurada en Java

Informática Industrial I

Ejercicios del Tema 3. Fundamentos de la programación en ensamblador

Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador.

Ingeniería Inversa en Linux

Programación de Computadores 4 Iteraciones y Decisiones. Prof. Javier Cañas. Universidad Técnica Federico Santa María Departamento de Informática

Diseño de compiladores. Organización de memoria. Organización de memoria. Organización de memoria. Zona de código 04/05/2014 ORGANIZACIÓN DE MEMORIA

Examen de Fundamentos de la Programación (Modelo 1)

FUNDAMENTOS PARA LA CONSTRUCCIÓN DEL CÓDIGO A PARTIR DEL ALGORITMO

Estructura de datos y Programación

Módulo. = Asignación = = Comp. de igualdad!= Com. de desigualdad <= Comp. menor o igual >= Comp. mayor o igual AND lógico OR lógica.

Código Intermedio. Compiladores II 1

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

Programación en Lenguaje C

TEMA 4. ESTRUCTURAS DE CONTROL

Tema 13: Apuntadores en C

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

Lección 2 Introducción al lenguaje C

Introducción a la. Programación con

PROGRAMACION ESTRUCTURADA: Tema 1. El lenguaje de programación C

Práctica #4: Uso de control de flujo

Memoria Estática Punteros, Vectores y Matrices

Programación Orientada Objetos. Estructuras de control if, If else, switch

Programación Avanzada CONCEPTOS BÁSICOS DE IMPLEMENTACIÓN EN C++

Introducción a Java. Introducción a Java. Programación I

Memoria Estática Punteros, Vectores y Matrices

Transcripción:

Reconstrucción de Código Joxean Koret

Guión Introducción Fundamentos Construcciones típicas Variables Llamadas a funciones Sentencias condicionales Bucles Ejemplos Durante la charla se irá reconstruyendo un sencillo programa

Introducción Para qué hace falta? Para recuperar código fuente perdido Para duplicar (y extender) algoritmos Para entender al completo un algoritmo Decompilación Hasta qué punto es posible? Pérdida de información Optimizaciones del compilador

Fundamentos Compiladores y dialectos de ensamblador Cada compilador genera un código diferente Cada compilador utiliza sus propias convenciones de llamadas Cada compilador se basa en «estándares» diferentes Sin embargo, todos llevan al final la misma lógica Una acción se puede hacer de mil modos pero sigue siendo la misma acción

Convenciones de llamadas Llamadas a función Las típicas: cdecl stdcall fastcall pascal Cada compilador utiliza una convención por defecto diferente Típicamente, en C, se utiliza cdecl (funciones normales) y stdcall (funciones exportadas)

Convenciones de llamadas Cdecl Los argumentos se pasan en la pila de derecha a izquierda y se arregla la pila dentro de la función llamada Stdcall Exactamente igual pero se arreglan por la función que llama, no por la función invocada Fastcall Los argumentos se pasan en registros y utilizando la pila. Se pasan de derecha a izquierda: Pascal ECX, EDX, PILA Igual que fastcall pero se utiliza como primer registro EDX

Otras convenciones de llamadas Thiscall Es la convención de llamadas de C++ Es igual que cdecl pero siempre se pasa en ECX el puntero a this, es decir, un puntero al objeto En esta charla se excluyen ejemplos en C++ Al igual que en Visual Basic, Pascal, etc... Solo hablaremos de C

Construcciones típicas Variables Stack, heap y globales Llamadas a funciones Con los diferentes tipos de convenciones de llamadas Sentencias condicionales If, else, switch, etc... Bucles For y while Estructuras Cómo es una estructura en ensamblador?

Variables y llamadas a función Stack y cdecl

Variables y llamadas a función Stack y cdecl

Variables y llamadas a función Stack y cdecl En este ejemplo se utilizan: Variables de stack SUB ESP, 0x100 ; 255 bytes de memoria en ESP LEA ECX, [EBP+TEXT] ; Se carga la dirección Llamada a una función cdecl Call _foo ; Se llama a la función Add esp, 4; Y luego se arregla la pila Los argumentos se recogen de la pila Ahora veamos ejemplos reales: Visual C++, Borland Builder, GCC

Reconstrucción de código Qué hemos aprendido? Sabemos cuanto espacio se ha reservado para variables locales Sabemos el tamaño de las variable estáticas Sabemos la convención de llamadas Por lo cual, sabemos que argumentos se le han pasado a la función Ya sabemos reconstruir simples llamadas a función Veamos el ejemplo

Este código entonces...

...quedaría entonces así void cdecl foo(int *arg) { int buf[0x100]; strcpy(buf, arg); MessageBoxA(0, buf, buf, 0); void cdecl foo(char *arg) { char buf[0x100-1]; strcpy(buf, arg); MessageBoxA(0, buf, buf, 0);

Más con variables Y si la variable fuera local pero dinámica y no estática?

Código void cdecl foo(int *arg) { int *buf; strcpy(buf, arg); MessageBoxA(0, buf, buf, 0); void cdecl foo(char *arg) { char *buf; strcpy(buf, arg); MessageBoxA(0, buf, buf, 0);

Más con variables Y si la variable fuera global? Veríamos un «offset dword_address» en el IDA O con símbolos un offset a la variable:

Código int buf[255]; char buf[255]; void cdecl foo(int *arg) { strcpy(buf, arg); MessageBoxA(0, buf, buf, 0); void cdecl foo(char *arg) { strcpy(buf, arg); MessageBoxA(0, buf, buf, 0);

Sentencias condicionales Cómo se representa una construcción IF/ELSE o SWITCH en ensamblador? Cada compilador hace lo que le da la gana Pero en general, todos siguen la misma forma A la hora de reconstruir el código tomaremos la siguiente norma: Utilizar GOTOs inicialmente Y, lo más importante, invertir la operación Quedará más claro en el siguiente ejemplo...

Sentencias condicionales

Código if (argc == 1) { _usage(argv[0]); _exit(1); else { goto loc_40106c; if (argc == 1) { usage(argv[0]); exit(1); else { foo(argv[1]); loc_40106c: _foo(argv[1]);

Más sentencias condicionales

Código if (argc == 1) { _usage(argv[0]); _exit(1); If (argc > 2) goto loc_40106c; _printf( Tu madre... ); _exit(2); loc_40106c: _foo(argv[1]); if (argc == 1) { usage(argv[0]); exit(1); else if (argc > 2) { printf( Tu madre... ); exit(2); else { foo(argv[1]);

Bucles Cómo se crean los bucles (for, while) en ensamblador? Pocas veces se utilizan las construcciones que un humano usaría: LOOP, LOOPE, etc... Normalmente se utilizan saltos al igual que con las sentencias condicionales LOC_XXX: <<STUFF>> CMP EAX, 1 JNZ LOC_XXX Veamos un ejemplo...

Más sentencias condicionales

Código: Normalizando void _foo(int arg_0, int arg_1) { int var_4; var_4 = 0; goto loc_401016 loc_40100d: var_4++; loc_401016: if (arg_0 < var_4) { _printf("arg %d: %s\n", arg_0, arg_4); goto loc_40100d; void _foo(int arg_0, int arg_1) { int var_4; for (var_4 = 0; { var_4 < arg_0; var_4++) _printf("arg %d: %s\n", arg_0, arg_4);

Ejercicio Reconstruir el código C del programa 'reco01' Se puede elegir el ELF x86, ARM o el PE x86 No hemos visto como hacerlo en ARM pero... Será muy diferente? ;) Punto adicional: Qué es lo que hace?