|
72 | 72 | },
|
73 | 73 | }
|
74 | 74 |
|
| 75 | +ELF_ABIS: Dict[lief.ELF.ARCH, Dict[lief.ENDIANNESS, List[int]]] = { |
| 76 | + lief.ELF.ARCH.x86_64: { |
| 77 | + lief.ENDIANNESS.LITTLE: [3,2,0], |
| 78 | + }, |
| 79 | + lief.ELF.ARCH.ARM: { |
| 80 | + lief.ENDIANNESS.LITTLE: [3,2,0], |
| 81 | + }, |
| 82 | + lief.ELF.ARCH.AARCH64: { |
| 83 | + lief.ENDIANNESS.LITTLE: [3,7,0], |
| 84 | + }, |
| 85 | + lief.ELF.ARCH.PPC64: { |
| 86 | + lief.ENDIANNESS.LITTLE: [3,10,0], |
| 87 | + lief.ENDIANNESS.BIG: [3,2,0], |
| 88 | + }, |
| 89 | + lief.ELF.ARCH.RISCV: { |
| 90 | + lief.ENDIANNESS.LITTLE: [4,15,0], |
| 91 | + }, |
| 92 | +} |
| 93 | + |
75 | 94 | # Allowed NEEDED libraries
|
76 | 95 | ELF_ALLOWED_LIBRARIES = {
|
77 | 96 | # bitcoind and bitcoin-qt
|
@@ -242,12 +261,19 @@ def check_ELF_interpreter(binary) -> bool:
|
242 | 261 |
|
243 | 262 | return binary.concrete.interpreter == expected_interpreter
|
244 | 263 |
|
| 264 | +def check_ELF_ABI(binary) -> bool: |
| 265 | + expected_abi = ELF_ABIS[binary.header.machine_type][binary.abstract.header.endianness] |
| 266 | + note = binary.concrete.get(lief.ELF.NOTE_TYPES.ABI_TAG) |
| 267 | + assert note.details.abi == lief.ELF.NOTE_ABIS.LINUX |
| 268 | + return note.details.version == expected_abi |
| 269 | + |
245 | 270 | CHECKS = {
|
246 | 271 | lief.EXE_FORMATS.ELF: [
|
247 | 272 | ('IMPORTED_SYMBOLS', check_imported_symbols),
|
248 | 273 | ('EXPORTED_SYMBOLS', check_exported_symbols),
|
249 | 274 | ('LIBRARY_DEPENDENCIES', check_ELF_libraries),
|
250 | 275 | ('INTERPRETER_NAME', check_ELF_interpreter),
|
| 276 | + ('ABI', check_ELF_ABI), |
251 | 277 | ],
|
252 | 278 | lief.EXE_FORMATS.MACHO: [
|
253 | 279 | ('DYNAMIC_LIBRARIES', check_MACHO_libraries),
|
|
0 commit comments