pdf 파일: ​​"pdfid"에 대한 결과

pdf 파일: ​​"pdfid"에 대한 결과

Didier Stevens는 다음과 같은 쇼를 제작했습니다."pdfid"(https://blog.didierstevens.com/2009/03/31/pdfid/ 그리고 https://blog.didierstevens.com/programs/pdf-tools/#pdfid).

그는 말했다:

"저는 PDF 문서를 분류하기 위한 새로운 도구인 PDFiD를 개발했습니다. 이 도구는 악성일 수 있는 PDF 문서와 악성이 아닐 가능성이 가장 높은 PDF 문서를 구별하는 데 도움이 됩니다."

그것이 내가 그것을 사용하고 싶은 것입니다.

"PDFiD는 PDF 문서에서 주어진 문자열 목록을 스캔하고 각 단어의 발생 횟수(전체 및 난독화)를 계산합니다."

obj

endobj

stream

endstream

xref

trailer

startxref

/Page

/Encrypt

/ObjStm

/JS

/JavaScript

/AA

/OpenAction

/AcroForm

/JBIG2Decode

/RichMedia

/Launch

/XFA

내가 아는 한, "obj"와 "endobj"의 값은 일치해야 합니다. 즉, 열려 있는 닫히지 않은 개체가 없다는 의미입니다(이로 인해 버퍼 오버플로 또는 기타 문제가 발생할 수 있음).

이상적으로는

/JS /JavaScript /AA /OpenAction /AcroForm

값이 0이어야 합니다.

그런데 "obj"와 "endobj"가 일치하지 않는 PDF 문서를 많이 봤는데, 다른 값은 괜찮은 것 같습니다.

예: 다음의 Using_FreeDOS.pdfhttp://www.freedos.org/ebook/download/using-freedos-24.pdf.

pdfid 결과:

 PDF Header: %PDF-1.4

 obj                  520

 endobj               519

 stream               193

 endstream            193

 xref                   1

 trailer                1

 startxref              1

 /Page                100

 /Encrypt               0

 /ObjStm                0

 /JS                    0

 /JavaScript            0

 /AA                    0

 /OpenAction            1

 /AcroForm              0

 /JBIG2Decode           0

 /RichMedia             0

 /Launch                0

 /EmbeddedFile          0

 /XFA                   0

 /URI                   8

 /Colors > 2^24         0

그러나 여기에는 "/OpenAction 1"도 있습니다. 이것이 얼마나 관련성이 있는지 잘 모르겠습니다.

그럼에도 불구하고:

문자열 목록의 나머지 부분과 개수가 정상일 때 "obj"와 "endobj"가 일치하는 것이 얼마나 중요합니까?

이미 말했듯이 "obj"와 "endobj"가 일치하지 않는 PDF 문서가 많이 있습니다.

답변1

pdfid는 분명히 obj/endobj 쌍을 계산하는 끔찍한 작업을 수행합니다. 특정 예에서 이상한 "obj"는 FlateDecode 스트림의 일부입니다.

$ cat pdf.pl
use Compress::Zlib qw(inflateInit Z_STREAM_END);
use strict;
my ($o);
while(<>){
        $o -= s/\bendobj\b//g;
        $o += s/\b\d+\s+\d+\s+obj\b//g;
        if(/\bstream\s*$/){
                local $/ = "endstream"; my $s = <>; $s =~ s/\s*endstream$//;
                if($s =~ /(\w*obj)/){
                        my ($d, $err) = inflateInit->inflate($s);
                        if(length($s) == 0 && $err == Z_STREAM_END){
                                warn "innocuous '$1' in well formed stream\n";
                        }else{
                                warn "WARNING: inflateInit: $err\n";
                        }
                }
        }
        if(/(\w*obj)\b/){ warn "WARNING: possible stray $1\n" }
}
warn "WARNING: unbalanced obj/endobj: $o\n" if $o;
$ perl pdf.pl using-freedos-24.pdf
innocuous 'obj' in well formed stream

참고: 이는 현재 문제를 설명하기 위한 것일 뿐입니다. PDF가 안전한지 확인하는 데 사용하지 마세요.

PDF 형식은 매우 번거롭고 복잡합니다. 구조를 이해하려면 정교한 파서가 필요합니다. 악성 PDF를 올바르게 식별하기 위해 이를 수행할 수 있는 프로그램 자체가 공격 벡터가 됩니다. 임시 파서가 libpoppler 또는 libmupdf보다 더 안전하다고 믿을 이유가 없습니다.

관련 정보