Shellcoding en sistemas Linux
Avatar de Usuario
vlan7
 
Mensajes: 87
Registrado: Jue Jul 22, 2010 3:45 pm
Ubicación: Mas alla del EIP

[code] averigua en que segmento coloca el S.O. las variables

por vlan7 Vie Sep 21, 2012 7:50 pm

Hola,

Este codigo me parecio util para averiguar en que segmento de memoria coloca el S.O. las variables de un codigo C segun sean globales, locales, etc. El codigo tambien muestra el valor de cada variable y su direccion de memoria en esa ejecución. Y alguna cosa mas.

El resultado es que las variables definidas como static en el codigo se colocan en la misma posicion de memoria en todas las ejecuciones. Lo mismo para las globales. Tengo en mi sistema /proc/sys/kernel/randomize_va_space = 2

Es decir, en una compilacion estandar con gcc 4.4.3
Código: Seleccionar todo
root@bt:~# gcc getseg.c -o getseg

ejecutamos y
Código: Seleccionar todo
root@bt:~# ./getseg
global_initialized_var is at address 0x00601028
static_initialized_var is at address 0x0060102c

static_var is at address 0x00601040
global_var is at address 0x00601044

heap_var is at address 0x01b99010

stack_var is at address 0xe590418c
the function's stack_var is at address 0xe590416c
root@bt:~# ./getseg
global_initialized_var is at address 0x00601028
static_initialized_var is at address 0x0060102c

static_var is at address 0x00601040
global_var is at address 0x00601044

heap_var is at address 0x01b03010

stack_var is at address 0x1962a25c
the function's stack_var is at address 0x1962a23c
root@bt:~#

ASLR no ha aleatorizado las posiciones de memoria de las globales. Las static tambien residen siempre en la misma posicion de memoria.

La version de glibc es la 2.11.1

Enjoy!

Código: Seleccionar todo
#unknown author
#include <stdio.h>

int global_var;
int global_initialized_var = 5;

void function() {  // This is just a demo function
   int stack_var; // notice this variable has the same name as the one in main()

   printf("the function's stack_var is at address 0x%08x\n", &stack_var);
}

int main() {
   int stack_var; // same name as the variable in function()
   static int static_initialized_var = 5;
   static int static_var;
   int *heap_var_ptr;

   heap_var_ptr = (int *) malloc(4);

   // These variables are in the data segment
   printf("global_initialized_var is at address 0x%08x\n", &global_initialized_var);
   printf("static_initialized_var is at address 0x%08x\n\n", &static_initialized_var);

   // These variables are in the bss segment
   printf("static_var is at address 0x%08x\n", &static_var);
   printf("global_var is at address 0x%08x\n\n", &global_var);

   // This variable is in the heap segment
   printf("heap_var is at address 0x%08x\n\n", heap_var_ptr);

   // These variables are in the stack segment
   printf("stack_var is at address 0x%08x\n", &stack_var);
   function();
}
int *p = new int[7];
p = p + 7;
*p = 42;

int a[7];
a[7] = 42; /* ESC[2;9y */
Avatar de Usuario
newlog
El Eterno Alumno
 
Mensajes: 170
Registrado: Lun Jun 23, 2008 7:28 pm

Re: [code] averigua en que segmento coloca el S.O. las varia

por newlog Sab Sep 22, 2012 2:07 pm

Buenas vlan7,

Qué bueno! No tenía ni idea de eso. Seguro que se puede aprovechar de algún modo. Por ejemplo si un programa ejecuta '/bin/sh' se puede aprovechar la cadena para programar el shellcode si la cadena está en una variable estática (todo dentro de un sistema con ASLR). Es lo primero que se me pasa por la cabeza...

---

Que casualidad, hace unas semanas yo también programé un código para saber exactamente en qué segmentos se ubicaban todas las variables. Aquí dejo el mio, es un poco más feo por tanto texto:

Código: Seleccionar todo
#include <stdio.h>
#include <stdlib.h>

/* Variable global inicializada. [data] */
int init_global_var = 10;
/* Variable global no inicializada. [bss] */
int global_var;
/* Variable global estatica inicializada. [data] */     
static int init_static_var = 20;
/* Variable global estatica no inicializada. [bss] */
static int static_var;

int main(int argc, char **argv, char **envp)
{
    /* Variable local estatica inicializada. [data] */
    static int init_static_local_var = 30;
    /* Variable local estatica no inicializada. [bss] */
    static int static_local_var;
    /* Variable local inicializada. [stack] */
    int init_local_var = 40;
    /* Variable local no inicializada. [stack] */
    int local_var;
    /* Variable dinamica. [heap] */
    void * dynamic_var = malloc (100);

    printf("Direccion de la funcion main [.text]: %p\n",             &main);
    printf("Distancia: %u bytes\n", (void *)&init_global_var - (void*)&main);
    printf("Direccion de la variable global inicializada [.data]: %p\n",       &init_global_var);
    printf("Distancia: %u bytes\n", (void *)&init_static_var - (void *)&init_global_var);
    printf("Direccion de la variable global estatica inicializada [.data]: %p\n",    &init_static_var);
    printf("Distancia: %u bytes\n", (void *)&init_static_local_var - (void *)&init_static_var);
    printf("Direccion de la variable local estatica inicializada [.data]: %p\n",    &init_static_local_var);
    printf("Distancia: %u bytes\n", (void *)&static_var - (void *)&init_static_local_var);
    printf("Direccion de la variable global estatica no inicializada [.bss]: %p\n",    &static_var);
    printf("Distancia: %u bytes\n", (void *)&static_local_var - (void *)&static_var);
    printf("Direccion de la variable local estatica no inicializada[.bss]: %p\n",    &static_local_var);
    printf("Distancia: %u bytes\n", (void *)&global_var - (void *)&static_local_var);
    printf("Direccion de la variable global no incializada [.bss]: %p\n",       &global_var);
    printf("Distancia: %u bytes\n", (void *)&dynamic_var - (void *)&global_var);
    printf("Direccion de la variable dinamica [heap]: %p\n",             dynamic_var);
    printf("Distancia: %u bytes\n", (void *)&local_var - (void *)&dynamic_var);
    printf("Direccion de la variable local no incializada [stack]: %p\n",       &local_var);
    printf("Distancia: %u bytes\n", (void *)&init_local_var - (void *)&local_var);
    printf("Direccion de la variable local inicializada [stack]: %p\n",       &init_local_var);
    printf("Distancia: %u bytes\n", (void *)&envp[0] - (void *)&init_local_var);
    printf("Direccions de la variable de entorno [cerca de 0xc0000000]: %p\n",       &envp[0]);

    exit(0);
}


La salida es:

Código: Seleccionar todo
Direccion de la funcion main [.text]: 0x8048424
Distancia: 7160 bytes
Direccion de la variable global inicializada [.data]: 0x804a01c
Distancia: 4 bytes
Direccion de la variable global estatica inicializada [.data]: 0x804a020
Distancia: 4 bytes
Direccion de la variable local estatica inicializada [.data]: 0x804a024
Distancia: 12 bytes
Direccion de la variable global estatica no inicializada [.bss]: 0x804a030
Distancia: 4 bytes
Direccion de la variable local estatica no inicializada[.bss]: 0x804a034
Distancia: 4 bytes
Direccion de la variable global no incializada [.bss]: 0x804a038
Distancia: 3078993772 bytes
Direccion de la variable dinamica [heap]: 0xa000008
Distancia: 4 bytes
Direccion de la variable local no incializada [stack]: 0xbf8a57a8
Distancia: 4 bytes
Direccion de la variable local inicializada [stack]: 0xbf8a57ac
Distancia: 192 bytes
Direccions de la variable de entorno [cerca de 0xc0000000]: 0xbf8a586c


Para las (pocas) explicaciones, el paper que espero publicar en breve.
Imagen
Avatar de Usuario
vlan7
 
Mensajes: 87
Registrado: Jue Jul 22, 2010 3:45 pm
Ubicación: Mas alla del EIP

Re: [code] averigua en que segmento coloca el S.O. las varia

por vlan7 Mié Oct 31, 2012 10:08 pm

A ver cuando subes ese paper que yo se que tiene info realmente fresca! 8-)
la explotacion del heap sigue siendo casi virgen y esto no puede seguir asi :idea:
int *p = new int[7];
p = p + 7;
*p = 42;

int a[7];
a[7] = 42; /* ESC[2;9y */
Avatar de Usuario
newlog
El Eterno Alumno
 
Mensajes: 170
Registrado: Lun Jun 23, 2008 7:28 pm

Re: [code] averigua en que segmento coloca el S.O. las varia

por newlog Jue Nov 01, 2012 5:33 pm

Pues sí!

Debería subirlo, pero hace un tiempo que le estoy dando vueltas a un rediseño a OM, y quizá debería publicarlo en ese momento.
Lo hablamos en privado ;)
Imagen
Volver a Linux

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado