ret libc, como elimino los ceros?

Iniciado por proxy_lainux, Febrero 20, 2020, 07:59:23 PM

Tema anterior - Siguiente tema

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

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

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?.

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





    Del codigo que posteaste no veo donde usas el struct. No se que es pero encotre esto No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    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?

uso python 2.7

Código: python
#!/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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta > 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

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.

Lo siento, no contesto dudas por MP, si tienes dudas las planteas en el foro.

hola

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

Código: php
print system 
$3 = {<text variable, no debug info>} 0xf7b2c700<system>

Código: php
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
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

yo seguí un ejemplo de exploitdb, pero igual es la misma idea

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.

Lo siento, no contesto dudas por MP, si tienes dudas las planteas en el foro.

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".