악성 PDF에서 메타데이터를 추출하는 코드/도구

악성 PDF에서 메타데이터를 추출하는 코드/도구

악성 PDF의 특성을 연구하고 있습니다. 저는 pdfinfo용 Python 래퍼를 사용하여 코드의 파일 크기 및 페이지 크기와 같은 일부 기능을 추출하고 있습니다. 이것은 코드의 래퍼 부분입니다.

 def pdfinf(infile):
   cmd = '/usr/bin/pdfinfo'
   if not osp.exists(cmd):
       raise RuntimeError('System command not found: %s' % cmd)
   if not osp.exists(infile):
       raise RuntimeError('Provided input file not found: %s' % infile)

   def _extract(row):
       """Extracts the right hand value from a : delimited row"""
       return row.split(':', 1)[1].strip()

   output = {}

   labels = ['Title', 'Author', 'Creator', 'Producer', 'CreationDate',
              'ModDate', 'Tagged', 'Pages', 'Encrypted', 'Page size',
              'File size', 'Optimized', 'PDF version']

   cmd_output = subprocess.check_output([cmd, infile])
   for line in cmd_output.splitlines():
       for label in labels:
           if label in line:
               output[label] = _extract(line)
   return output

la = lb = 0

for files in malware_files:
    path = "/home/hima/Downloads/data/mpdfs/" + files
    output = pdfinf(path)
    value = output['File size']
    value = value[:-6]
    lb += float(value)

그런데 계속해서 이런 오류가 발생합니다.

Syntax Error: Couldn't find trailer dictionary
Syntax Error (6689): Missing 'endstream' or incorrect stream length
Syntax Error (15795): Missing 'endstream' or incorrect stream length
Syntax Error: Couldn't find trailer dictionary
Syntax Error: Couldn't find trailer dictionary
Syntax Error: Couldn't read xref table
Traceback (most recent call last):
  File "code.py", line 67, in <module>
    output = pdfinf(path)
  File "code.py", line 50, in pdfinf
    cmd_output = subprocess.check_output([cmd, infile])
  File "/usr/lib/python2.7/subprocess.py", line 574, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['/usr/bin/pdfinfo', '/home/hima/Downloads/data/mpdfs/c9954f5f3fbfb3b150abe208c763d942043bfc0f.pdf']' returned non-zero exit status 1

악성 파일에서 코드 실행이 중지되면 이러한 기능을 어떻게 추출합니까? 이러한 특성을 분석하고 싶은 이유는 연관성을 찾을 수 있지 않을까 생각하기 때문입니다. 쉘을 사용하거나 Python에서 래퍼를 사용하여 pdfinfo를 호출할 수 있습니까?

답변1

손상된 PDF 파일을 확인하는 가장 쉬운 방법은 대용량 파일을 처리할 수 있는 편집기에서 해당 파일을 여는 것입니다(저는 emacs를 사용합니다). 먼저 좋은 PDF 파일을 사용해 보세요. PDF 파일의 개체 구조가 표시되지만 콘텐츠 스트림의 일부 또는 전체가 압축됩니다. 이렇게 하면 "악성" PDF가 파서를 혼란시키기 위해 무엇을 하는지 확인할 수 있으며 이에 따라 파서를 수정할 수 있습니다. ("악성" PDF가 무엇을 하는지 알지 못하면 우리는 분명히 이 작업을 수행할 수 없습니다.)

mutool clean -d압축 해제된 스트림을 사용할 수도 있지만 mutool손상된 PDF의 기능으로 인해 혼란스러울 수도 있고 그렇지 않을 수도 있습니다. 다시 한 번 유효한 PDF에서 먼저 시도해 보세요.

관련 정보