12
12
13
13
import lief #type:ignore
14
14
15
+ # temporary constant, to be replaced with lief.ELF.ARCH.RISCV
16
+ # https://github.com/lief-project/LIEF/pull/562
17
+ LIEF_ELF_ARCH_RISCV = lief .ELF .ARCH (243 )
18
+
15
19
def check_ELF_RELRO (binary ) -> bool :
16
20
'''
17
21
Check for read-only relocations.
@@ -178,31 +182,46 @@ def check_control_flow(binary) -> bool:
178
182
return True
179
183
return False
180
184
181
-
182
- CHECKS = {
183
- lief .EXE_FORMATS .ELF : [
185
+ BASE_ELF = [
184
186
('PIE' , check_PIE ),
185
187
('NX' , check_NX ),
186
188
('RELRO' , check_ELF_RELRO ),
187
189
('Canary' , check_ELF_Canary ),
188
190
('separate_code' , check_ELF_separate_code ),
189
- ],
190
- lief .EXE_FORMATS .PE : [
191
+ ]
192
+
193
+ BASE_PE = [
191
194
('PIE' , check_PIE ),
192
195
('DYNAMIC_BASE' , check_PE_DYNAMIC_BASE ),
193
196
('HIGH_ENTROPY_VA' , check_PE_HIGH_ENTROPY_VA ),
194
197
('NX' , check_NX ),
195
198
('RELOC_SECTION' , check_PE_RELOC_SECTION ),
196
199
('CONTROL_FLOW' , check_PE_control_flow ),
197
- ],
198
- lief .EXE_FORMATS .MACHO : [
200
+ ]
201
+
202
+ BASE_MACHO = [
199
203
('PIE' , check_PIE ),
200
204
('NOUNDEFS' , check_MACHO_NOUNDEFS ),
201
205
('NX' , check_NX ),
202
206
('LAZY_BINDINGS' , check_MACHO_LAZY_BINDINGS ),
203
207
('Canary' , check_MACHO_Canary ),
204
208
('CONTROL_FLOW' , check_control_flow ),
205
209
]
210
+
211
+ CHECKS = {
212
+ lief .EXE_FORMATS .ELF : {
213
+ lief .ARCHITECTURES .X86 : BASE_ELF ,
214
+ lief .ARCHITECTURES .ARM : BASE_ELF ,
215
+ lief .ARCHITECTURES .ARM64 : BASE_ELF ,
216
+ lief .ARCHITECTURES .PPC : BASE_ELF ,
217
+ LIEF_ELF_ARCH_RISCV : BASE_ELF ,
218
+ },
219
+ lief .EXE_FORMATS .PE : {
220
+ lief .ARCHITECTURES .X86 : BASE_PE ,
221
+ },
222
+ lief .EXE_FORMATS .MACHO : {
223
+ lief .ARCHITECTURES .X86 : BASE_MACHO ,
224
+ }
206
225
}
207
226
208
227
if __name__ == '__main__' :
@@ -211,13 +230,24 @@ def check_control_flow(binary) -> bool:
211
230
try :
212
231
binary = lief .parse (filename )
213
232
etype = binary .format
233
+ arch = binary .abstract .header .architecture
234
+ binary .concrete
235
+
214
236
if etype == lief .EXE_FORMATS .UNKNOWN :
215
237
print (f'{ filename } : unknown executable format' )
216
238
retval = 1
217
239
continue
218
240
241
+ if arch == lief .ARCHITECTURES .NONE :
242
+ if binary .header .machine_type == LIEF_ELF_ARCH_RISCV :
243
+ arch = LIEF_ELF_ARCH_RISCV
244
+ else :
245
+ print (f'{ filename } : unknown architecture' )
246
+ retval = 1
247
+ continue
248
+
219
249
failed : List [str ] = []
220
- for (name , func ) in CHECKS [etype ]:
250
+ for (name , func ) in CHECKS [etype ][ arch ] :
221
251
if not func (binary ):
222
252
failed .append (name )
223
253
if failed :
0 commit comments