Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: _TTFH_3500 en 24 Diciembre 2021, 16:26 pm



Título: Ayuda para identificar algoritmo de compresion zlib
Publicado por: _TTFH_3500 en 24 Diciembre 2021, 16:26 pm
Hola, tengo un archivo que fue comprimido con zlib y estoy tratando de averiguar el método que fue utilizado para comprimirlo.

Este archivo en particular usa un nivel 9 de compresión, y por lo que pude descifrar la entrada se divide en bloques de 8KiB, y se hace Z_SYNC_FLUSH luego de comprimir cada bloque, pero cada 8 bloques el algoritmo parece hacer otra cosa.

Este es el código que escribí para descomprimir y comprimir el archivo.
Para descomprimir funciona bien, pero solo comprime correctamente los primeros 7 bloques del archivo.
Código
  1. import sys
  2. import zlib
  3.  
  4. # python3 zlib-flate.py -d output.bin input.bin
  5. # python3 zlib-flate.py -9 input.bin output_test.bin
  6.  
  7. def usage():
  8. print("Usage:")
  9. print(f"python3 {sys.argv[0]} -[1-9,d] input.bin output.bin")
  10. exit()
  11.  
  12. def main():
  13. argc = len(sys.argv)
  14. if argc != 4:
  15. usage()
  16. try:
  17. if sys.argv[1] == "-d":
  18. # Decompress file
  19. with open(sys.argv[2], "rb") as input_file, open(sys.argv[3], "wb") as output_file:
  20. data = input_file.read()
  21. comp_obj = zlib.decompressobj()
  22. data_plain = comp_obj.decompress(data)
  23. output_file.write(data_plain)
  24. else:
  25. # Compress file
  26. level = -int(sys.argv[1])
  27. if level < 1 or level > 9:
  28. print("Invalid compression level")
  29. with open(sys.argv[2], "rb") as input_file, open(sys.argv[3], "wb") as output_file, open("output.bin", "rb") as test_file:
  30. comp_obj = zlib.compressobj(level)
  31. data = input_file.read(8 * 1024) # Read block of 8KiB
  32. i = 1
  33. while data != b"":
  34. data_zip = comp_obj.compress(data)
  35. data_zip += comp_obj.flush(zlib.Z_SYNC_FLUSH)
  36.  
  37. # Check if compressed data differs
  38. lenght = len(data_zip)
  39. data_test = test_file.read(lenght)
  40. if data_zip == data_test:
  41. print(f"Block #{i}: correctly compressed")
  42. else:
  43. print(f"Block #{i}: invalid data")
  44. exit()
  45.  
  46. output_file.write(data_zip)
  47. data = input_file.read(8 * 1024)
  48. i = i + 1
  49. print("File compressed correctly!")
  50. except (IOError, ValueError) as error:
  51. print("Invalid parameters")
  52.  
  53. main()
  54.  

Archivo comprimido con zlib:
https://mega.nz/file/8a5C1SyQ#xqy9nCycTrWfrnwuvWa39xd128s9huSFuf8kOr6kK8Q