Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: proxy_lainux en Febrero 20, 2020, 07:59:23 PM

Título: ret libc, como elimino los ceros?
Publicado por: proxy_lainux en Febrero 20, 2020, 07:59:23 PM
Hola

Estaba haciendo un ejercicio sobre como hacer un exploit con return libc, pero me surgio un problema con una address, al hacer el clásico overflow, puedo conseguir un sigtrap sin problemas, pero en un tutorial que revise, menciona que hay que sacar system y la address de /bin/sh, de eso no hay problema pero resulta que la address de system contiene '00', y se reemplaza con el hex de la siguiente instruccion y me crea un error de segmentación.

system 0xf7b2c700

cuando lo coloco en python... (para esto utilizo el import struct ("I", address), solo lo coloco así para simplificar)

buff = "A"*81
buff += 0xf7b2c700
buff += "A"*4
buff += 0xf7f54f48

buff = "A"*81
buff += 0xf7b2c700
buff += 0xf7f54f48

y cuando reviso en gdb que está pasando, me aparece 0xf7b2c741 o 0xf7b2c748... lo que creo o me imagino que pasa, es que cambia la address por esos ceros de la address de system y por eso no se ejecuta ,así que me gustaría saber... ¿de qué manera podría dejar esos ceros intactos usando python - 0xf7b2c700?

saludos
Título: Re:ret libc, como elimino los ceros?
Publicado por: Erroneo0 en Febrero 20, 2020, 09:14:37 PM
Prueba coesto buff += "\0xf7\0xb2\0xc7\0x00", aunque vas a tener problemas por que python termina las strings igual que C.
Por otro lado ¿ no deberias poner el address en little endian?.
Título: Re:ret libc, como elimino los ceros?
Publicado por: proxy_lainux en Febrero 20, 2020, 09:43:21 PM
Hola

gracias, pero ese no es el problema.... para lo que mencionas utilizo el struct de python

me refiero a que a esa address que contiene cero '\x00', creo me lo toma como un null y no puedo conseguir la shell, ya que otros ejemplos tienen algo así "0xf7b2c760"... y eso más la libc de /bin /sh, hace que te de una shell

0xf7f54f48 + 0xf7b2c760 = shell

pero yo obtuve un cero que creo lo reconoce como un null, entonces queda algo así

0xf7f54f48 + 0xf7b2c700
0xf7f54f + 0xf7b2c748 ---> entonces queda la address que mal, no se si lo noten, pero el null es reemplazado por el numero continuo e incluso en gdb me sale esto

/bin/bash: aviso: sustitución de orden: se ignora byte nulo en la entrada




Título: Re:ret libc, como elimino los ceros?
Publicado por: Erroneo0 en Febrero 20, 2020, 10:09:35 PM
    Del codigo que posteaste no veo donde usas el struct. No se que es pero encotre esto https://docs.python.org/2/library/struct.html y https://rico-schmidt.name/pymotw-3/struct/.
    En efecto python termina las string con un byte nulo "\x00".
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
buff = "A"*81
buff += 0xf7b2c700
buff += "A"*4
buff += 0xf7f54f48

buff = "A"*81
buff += 0xf7b2c700
buff += 0xf7f54f48

y cuando reviso en gdb que está pasando, me aparece 0xf7b2c741 o 0xf7b2c748... lo que creo o me imagino que pasa, es que cambia la address por esos ceros de la address de system y por eso no se ejecuta ,así que me gustaría saber... ¿de qué manera podría dejar esos ceros intactos usando python - 0xf7b2c700?

Respecto a 0xf7b2c741 o 0xf7b2c748 me parece que esta concatenando las A al final del addres... donde esta el 00.

El como dejar esos ceros intactos... depende del programa, no se si puedes escribir 2 veces en la pila, sumar, o alguna operacion divertida.
¿que version de python usas?
Título: Re:ret libc, como elimino los ceros?
Publicado por: proxy_lainux en Febrero 20, 2020, 10:24:04 PM
uso python 2.7

Código (python) [Seleccionar]
#!/usr/bin/python

import struct

buff = "A"*81
buff += struct.pack("I", 0xf7b2c700) <-- system
buff += struct.pack("I", 0xf7f54f48) <--- /bin/sh

print buff


guardo el resultado en un archivo temporal... python file.py > tmp

y en gdb hago las pruebas... r $(cat  tmp)

De esa manera lo hago, y como mencioné, puedo hacer el sigtrap sin problemas haciendolo de forma normal, pero de esta forma con libc, creo que el null es lo que me está perjudicando
Título: Re:ret libc, como elimino los ceros?
Publicado por: animanegra en Febrero 21, 2020, 06:37:17 AM
Los ceros no los puedes poner. Y algun caracter mas que rompa cademas.(si tienes ina funcion de tipo sprintf o sscanf).  Si tienes una direccion que termina en cero ponle 0x01 y saltas a la direccion siguiente de la funcion. A nivel de maquina joderas la pila pero la funcion se ejecutara. Si los ceros estan en los bytes altos. No los pongas y reza para que los bytes que hay despues de tu buffer sean ceros. Si estan en posiciones intermedias es mas jodido. Puedes tambien buscar saltos a otros sitios sin ceros que tengan como instruccion un salto a la direccion que quieres o porciones de codigo que cambien el byte que deseas en el ensamblador y despues saltar a la funcion.
Título: Re:ret libc, como elimino los ceros?
Publicado por: proxy_lainux en Febrero 22, 2020, 12:13:18 AM
hola

los ceros no los pongo, así se establece ya... cuando hago un print en system

print system
$3 = {<text variable, no debug info>} 0xf7b2c700<system>

Esto es de /bin/sh <--> 0xf7f54f48

y cuando los coloco, esos ceros cambian... en otras palabras la address de system no busca 0xf7b2c700, sino que busca 0xf7b2c748 <---- aqui donde me imagino que es el error, porque debería ir a 0xf7b2c700, pero cambian esos ceros por el 48 de la direccion de /bin/sh (0xf7f54f48 <---)...

voy a dejar un video de youtube donde esta mejor explicado
https://www.youtube.com/watch?v=Gu_JGaWpcn4

yo seguí un ejemplo de exploitdb, pero igual es la misma idea
Título: Re:ret libc, como elimino los ceros?
Publicado por: animanegra en Febrero 22, 2020, 02:32:01 AM
Ceros malos:
0x7f466500

Estan al principio de la direccion. En el buffer metes AAAAAAAAAAAAA y la direccion al reves 00 50 66 f4 07

Ceros asumibles:
0x00004567

Estan al final de la direccikn. Bit mas significativo. Metes la direccion al reves que queda 67 45 y ahi en lugar de poner ceros no pones nada. Si la memoria esta seteada. Cuando lees ese entero a partir del 45 el numero sera 0x00004567 porque las bytes que siguen a los que has puesto a posta en el buffer no se han tocado. Y como estanseteados estan a cero por defecto.

Puede ser que estes metiendo la direccion al reves?? Para la memoria meterla al reves eseterla en el orden de lectura humano.
Título: Re:ret libc, como elimino los ceros?
Publicado por: Erroneo0 en Febrero 22, 2020, 06:58:40 PM
Gracias por la version de python.
La entrada que se hace al programa es 'AAAAAAAAAA\x00\xc7\xb2\xf7'. Pero no podes poner esos ceros en la cadena por mas que esa sea la direccion de la funcion system() ,deberias buscar otra direccion de memoria para saltar con el 'ret' y poder ejecutar "/bin/sh".