|
75 | 75 | },
|
76 | 76 | }
|
77 | 77 |
|
| 78 | +ELF_ABIS: Dict[lief.ELF.ARCH, Dict[lief.ENDIANNESS, List[int]]] = { |
| 79 | + lief.ELF.ARCH.x86_64: { |
| 80 | + lief.ENDIANNESS.LITTLE: [3,2,0], |
| 81 | + }, |
| 82 | + lief.ELF.ARCH.ARM: { |
| 83 | + lief.ENDIANNESS.LITTLE: [3,2,0], |
| 84 | + }, |
| 85 | + lief.ELF.ARCH.AARCH64: { |
| 86 | + lief.ENDIANNESS.LITTLE: [3,7,0], |
| 87 | + }, |
| 88 | + lief.ELF.ARCH.PPC64: { |
| 89 | + lief.ENDIANNESS.LITTLE: [3,10,0], |
| 90 | + lief.ENDIANNESS.BIG: [3,2,0], |
| 91 | + }, |
| 92 | + lief.ELF.ARCH.RISCV: { |
| 93 | + lief.ENDIANNESS.LITTLE: [4,15,0], |
| 94 | + }, |
| 95 | +} |
| 96 | + |
78 | 97 | # Allowed NEEDED libraries
|
79 | 98 | ELF_ALLOWED_LIBRARIES = {
|
80 | 99 | # dashd and dash-qt
|
@@ -248,12 +267,19 @@ def check_ELF_interpreter(binary) -> bool:
|
248 | 267 |
|
249 | 268 | return binary.concrete.interpreter == expected_interpreter
|
250 | 269 |
|
| 270 | +def check_ELF_ABI(binary) -> bool: |
| 271 | + expected_abi = ELF_ABIS[binary.header.machine_type][binary.abstract.header.endianness] |
| 272 | + note = binary.concrete.get(lief.ELF.NOTE_TYPES.ABI_TAG) |
| 273 | + assert note.details.abi == lief.ELF.NOTE_ABIS.LINUX |
| 274 | + return note.details.version == expected_abi |
| 275 | + |
251 | 276 | CHECKS = {
|
252 | 277 | lief.EXE_FORMATS.ELF: [
|
253 | 278 | ('IMPORTED_SYMBOLS', check_imported_symbols),
|
254 | 279 | ('EXPORTED_SYMBOLS', check_exported_symbols),
|
255 | 280 | ('LIBRARY_DEPENDENCIES', check_ELF_libraries),
|
256 | 281 | ('INTERPRETER_NAME', check_ELF_interpreter),
|
| 282 | + ('ABI', check_ELF_ABI), |
257 | 283 | ],
|
258 | 284 | lief.EXE_FORMATS.MACHO: [
|
259 | 285 | ('DYNAMIC_LIBRARIES', check_MACHO_libraries),
|
|
0 commit comments