Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.38 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import os
  4. from glob import glob
  5. import tarfile
  6.  
  7. from elftools.elf.elffile import ELFFile
  8.  
  9. valid_dirs = ['usr/bin/', 'usr/sbin/']
  10.  
  11.  
  12. def _file_has_magic(fileobj, magic_bytes):
  13. length = len(magic_bytes)
  14. magic = fileobj.read(length)
  15. fileobj.seek(0)
  16. return magic == magic_bytes
  17.  
  18.  
  19. def is_elf(fileobj):
  20. "Take file object, peek at the magic bytes to check if ELF file."
  21. return _file_has_magic(fileobj, b"\x7fELF")
  22.  
  23.  
  24. def is_pie(fp):
  25. elf = ELFFile(fp)
  26. return elf.header['e_type'] == 'ET_DYN'
  27.  
  28.  
  29. def check_tar(xzfile):
  30. with tarfile.open(xzfile) as tar:
  31. for entry in tar:
  32. if not entry.isfile():
  33. continue
  34.  
  35. in_dir = any(entry.name.startswith(d) for d in valid_dirs)
  36.  
  37. if not in_dir:
  38. continue
  39.  
  40. fp = tar.extractfile(entry)
  41. if not is_elf(fp):
  42. continue
  43.  
  44. elf = ELFFile(fp)
  45. if elf.header['e_type'] == 'ET_DYN':
  46. print('{}: PIE'.format(entry.name))
  47. return True
  48. else:
  49. print('{}: Cake is a lie!'.format(entry.name))
  50. return False
  51.  
  52. no_pie = []
  53. files = glob('/srv/ftp/pool/packages/*.pkg.tar.xz')
  54. for pkg in files:
  55. if not check_tar(pkg):
  56. no_pie.append(os.path.basename(pkg))
  57.  
  58. pie = len(files) - len(no_pie)
  59. print('PIE stats {}/{}'.format(pie, len(files)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement