Вы находитесь на странице: 1из 3

Exploitation: Conocimientos previos II

Como explicaba en la entrada anterior, la memoria est dividida en 5 segmentos. Para aclarar conceptos vamos a ejecutar el siguiente programa (el cdigo debera ser autoexplicativo). #include <stdio.h> #include <stdlib.h> #include <string.h>

int iglobal_1 = 1; ! int global_1; " 5 void fun(int arg_1, int arg_2, int arg_3) # int local_1 =1, local_2=2; $ !! "tac# $or $ara% % $rintf(&arg_1 ' ()*(+) con valor *d ,"-./012n&,3arg_1,arg_1); & $rintf(&arg_2 ' ()*(+) con valor *d ,"-./012n&,3arg_2,arg_2); 1' $rintf(&arg_3 ' ()*(+) con valor *d ,"-./012n2n&,3arg_3,arg_3); 11 !! "tac# local 1 $rintf(&local_1 ' ()*(+) con valor *d 1! ,"-./012n&,3local_1,local_1); 1" $rintf(&local_2 ' ()*(+) con valor *d 15 ,"-./012n2n&,3local_2,local_2); 1# 4 1$ 1% int %ain(char5 argv,1, int argc) 1& int local_1; ' char 5hvar = %alloc(1((5si6eof(char)); 1 strc$7(hvar,&hea$8var&); ! " $rintf(&local_1 ' ()*(+) con valor *d 5 ,"-./012n&,3local_1,local_1); # $rintf(&iglobal_1 ' ()*(+) con valor *d $ ,9.-.12n&,3iglobal_1,iglobal_1); % $rintf(&global_1 ' ()*(+) con valor *d & ,:""12n2n&,3global_1,global_1); !' $rintf(&hvar ' ()*(+) con valor *s ,;<.=12n2n&,hvar,hvar); !1 fun(31,32,33); return (; 4 (o importante no es tanto el cdigo como el resultado, )ue permite comprobar el lugar en el )ue *an sido colocadas las variables del programa.

1 adrian'ubuntu>?!e)$loiting@ .!a.out local_1 ' ()bf+A(adc con valor 3+AB32B ,"-./01 ! iglobal_1 ' ()(+(Ba(1c con valor 21 ,9.-.1 " global_1 ' ()(+(Ba(2+ con valor 22 ,:""1 5 # hvar ' ()(C(B3((+ con valor hea$8var ,;<.=1 $ % arg_1 ' ()bf+A(ac( con valor 31 ,"-./01 & arg_2 ' ()bf+A(acB con valor 32 ,"-./01 1' arg_3 ' ()bf+A(ac+ con valor 33 ,"-./01 11 1 local_1 ' ()bf+A(aac con valor 1 ,"-./01 1! local_2 ' ()bf+A(aa+ con valor 2 ,"-./01 +bservad )ue el mapa de memoria es el )ue mostramos en la entrada anterior, los datos en las direcciones ms bajas, luego el bss (*a, padding de por medio), a continuacin las variables del *eap , -inalmente el stac. -rame. /ijaos como el stac.-rame es tal , como comentbamos en la entrada anterior (para ! bits, en #" es di-erente). 1 (gdb) )!1DE) @s$ ()bffffB3(> ()(((((((( ()(((((((( ()bffffBA+ ()((2+ff+( ()bffffB++ ()((2+ff+( ()(((((((2 ()(((((((1 ! ()bffffBB(> " ()bffffBA(> ()bffffBDB ()((3+CffB ()bffffB++ ()(+(B+AcA 5 ()bffffBD(> ()((((((1f ()((((((2( ()((((((21 ()bffffB++ 0sta muestra de la pila se *a tomado a la entrada de la -uncin -un, tras la iniciali1acin de las variables locales. /ijaos en la direccin de retorno, la 0x080485c5, ms arriba est el valor previo del 02P, el 0xbffff488, un poco de padding del compilador , las variables locales con valores 1 , . 3usto debajo de la direccin de retorno se encuentran los valores )ue *a recibido como parmetros4 1- (!1), ' (! ), 1 (!!). 5isto esto, es importante resaltar el tipo de alineacin en memoria. 0l x%# utili1a little endian, lo )ue )uiere decir )ue el byte menos signi-icativo se coloca en la parte ms baja de la memoria. 6i )uer7is podemos ver un ejemplo, usaremos la direccin de retorno, situada en la posicin de memoria 0xbffff45c, , la mostraremos como una palabra de ! bits , luego b,te a b,te. Como se ve, la palabra est invertida b,te a b,te. 1 (gdb) )!E) ()bffffBAc ()bffffBAc> ()(+(B+AcA ! (gdb) )!Bb) ()bffffBAc " ()bffffBAc> ()cA ()+A ()(B ()(+ 0sto )uiere decir )ue si )ueremos cargar en memoria el valor 0x080485c5, debemos insertarlo como \xc5\x85\x04\x08. /cil, 8verdad9. +tro tema importante cuando *ablamos de explotacin, es conocer el -ormato del ejecutable )ue estamos utili1ando. :os centraremos al principio en (inux, por lo )ue el -ormato )ue nos interesa es el 0(/, en las siguientes entradas explicaremos dos clsicos, .plt , .dtors. Cuando *ablemos de ;indo<s, el -ormato )ue debemos conocer es P0. =lgo importante, tanto para depurar , mostrar direcciones de memoria , valores, como para entender la vulnerabilidad de -ormat strings )ue explicaremos en -uturas entradas (s, otro clsico, pero esto es un repaso a lo bsico, 8no9), es comprender el -uncionamiento de la -amilia de -unciones print-. 5eamos )u7 sucede cuando utili1amos print- de la siguiente manera4

1 $rintf(&<sto es un nF%ero *d2n&,2(); 1 (gdb) disas %ain 9u%$ of asse%bler code for function %ain> $ush *eb$ ! ()(+(B+3eB <%ainG(>> ()(+(B+3eA <%ainG1>> %ov *es$,*eb$ " and @()fffffff(,*es$ 5 ()(+(B+3eH <%ainG3>> ()(+(B+3ea <%ainGD>> sub @()1(,*es$ # %ov @()+(B+Bd(,*ea) $ ()(+(B+3ed <%ainGC>> ()(+(B+3f2 <%ainG1B>> %ovl @()1B,()B(*es$) % %ov *ea),(*es$) & ()(+(B+3fa <%ainG22>> 1' ()(+(B+3fd <%ainG2A>> call ()+(B+31c <$rintf'$lt> 11 ()(+(B+B(2 <%ainG3(>> %ov @()(,*ea) 1 ()(+(B+B(H <%ainG3A>> leave 1! ()(+(B+B(+ <%ainG3D>> ret 1" <nd of asse%bler du%$. 15 (gdb) )!s ()+(B+Bd( 1# ()+(B+Bd(> &<sto es un nF%ero *d2n& 6i os -ijis desde main>& *asta main> 5, el compilador *a colocado en la pila la cadena Esto es un nmero %d\n, , tambi7n el valor ' ( 014). (a -uncin print- recorre la cadena de texto , va mostrando por pantalla los caracteres, *asta )ue encuentra un especi-icador de -ormato (?d en este caso), , entonces busca en la pila el valor )ue debe colocar en esa posicin. (a siguiente tabla muestra los especi-icadores de -ormato soportados.

especi-icadores de -ormato @erecen especial atencin ?n, as como ?x , Aaun)ue no aparece en la tablaA la posibilidad de imprimir el nA7simo caracter con el smbolo B. 1 $rintf(&<ste es el tercer valor *3@d2n&, 1,2,3,B,A); Cmprimir el siguiente mensaje D0ste es el tercer valor !E. 0n las siguientes entradas nos metermos ,a en los desbordamientos clsicos de bu--er, )ue seguro )ue es ms interesante , entretenido. Como siempre, las dudas o aportaciones, en los comentarios.

Вам также может понравиться