Is the PE Attribute Certificate Table octaword-aligned or octabyte-aligned?
Looking at the Microsoft Portable Executable and Commmon Object File Specification rev 8.2 (Sept 21, 2010) - here’s rev 8.0 —which is the definition of the PE file format—I’m confused about the alignment of the entries in the Attribute Certificate Table.
- Page 58, section 4.7: “The attribute certificate table is composed of a set of contiguous, octaword-aligned attribute certificate entries.”
- Page 59, first paragraph: “Subsequent entries are accessed by advancing that entry’s dwLength bytes, rounded up to an 8-byte multiple, …”
- Page 59, algorithm step 2: “Round the value from step 1 up to the nearest 8-byte multiple …”
- Page 59, algorithm step 3: “… and round up to the nearest 8-byte multiple …”
- Page 60, last paragraph before the bullets: “If the bCertificate does not end on an octaword boundary, the attribute certificate table is padded with zeros, from the end of the bCertificate to the octaword boundary.”
So the documentation is confused. But, it also clearly says, on page 59, “If the sum of the rounded dwLength values does not equal the Size value, then either the attribute certificate table or the Size field is corrupted.” And on my sample, signed, executable, the Size field is a multiple of 8 but not 16, and WinVerifyTrust() says that the executable is authentic (and of course the loader will load and execute it).
So on the basis of this experimental evidence (one sample) I think we can conclude that the Attribute Certificate Table is octabyte aligned, not octaword aligned.