Skip to content

Commit cb7be68

Browse files
authored
Merge pull request #890 from elicn/more_posix_prot
More POSIX protection bits
2 parents 17d5898 + ca81d42 commit cb7be68

File tree

2 files changed

+57
-49
lines changed

2 files changed

+57
-49
lines changed

qiling/os/memory.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,9 +444,13 @@ def map_anywhere(self, size: int, minaddr: int = None, maxaddr: int = None, alig
444444

445445
return addr
446446

447-
def protect(self, addr, size, perms):
447+
def protect(self, addr: int, size: int, perms):
448+
# mask off perms bits that are not supported by unicorn
449+
perms &= UC_PROT_ALL
450+
448451
aligned_address = (addr >> 12) << 12
449452
aligned_size = self.align((addr & 0xFFF) + size)
453+
450454
self.ql.uc.mem_protect(aligned_address, aligned_size, perms)
451455

452456

qiling/os/posix/const_mapping.py

Lines changed: 52 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,28 @@
33
# Cross Platform and Multi Architecture Advanced Binary Emulation Framework
44
#
55

6+
from typing import MutableSequence
67
from .const import *
78
from qiling.const import *
89

910

10-
def _invert_dict(d):
11+
def _invert_dict(d: Mapping) -> Mapping:
1112
return { v:k for k, v in d.items()}
1213

1314

14-
def _constant_mapping(bits, d_map, ret=None, single_mapping=False):
15-
if ret is None:
16-
ret = []
17-
15+
def _constant_mapping(bits: int, d_map: Mapping[str, int], ret: MutableSequence[str] = [], single_mapping: bool = False) -> str:
1816
b_map = _invert_dict(d_map)
1917

2018
if single_mapping:
2119
return b_map[bits]
2220

2321
for val, sym in b_map.items():
24-
if val & bits != 0:
22+
if val & bits:
2523
bits ^= val
2624
ret.append(sym)
2725

28-
if bits != 0:
29-
ret.append(str(bits))
26+
if bits:
27+
ret.append(f'{bits:#x}')
3028

3129
return " | ".join(ret)
3230

@@ -227,13 +225,13 @@ def open_flags_mapping(flags, arch):
227225
arm64_open_flags = arm_open_flags
228226

229227
mapping_dict = {
230-
QL_ARCH.X86: linux_open_flags,
231-
QL_ARCH.X8664: linux_open_flags,
232-
QL_ARCH.ARM: arm_open_flags,
233-
QL_ARCH.ARM64: arm64_open_flags,
234-
QL_ARCH.MIPS: mips_open_flags,
235-
QL_OS.MACOS: mac_open_flags,
236-
}.get(arch)
228+
QL_ARCH.X86: linux_open_flags,
229+
QL_ARCH.X8664: linux_open_flags,
230+
QL_ARCH.ARM: arm_open_flags,
231+
QL_ARCH.ARM64: arm64_open_flags,
232+
QL_ARCH.MIPS: mips_open_flags,
233+
QL_OS.MACOS: mac_open_flags,
234+
}[arch]
237235

238236
ret = ["O_RDONLY"]
239237

@@ -270,50 +268,56 @@ def mmap_prot_mapping(prots):
270268
'PROT_READ' : 0x1,
271269
'PROT_WRITE': 0x2,
272270
'PROT_EXEC' : 0x4,
271+
272+
# not supported by unicorn
273+
'PROT_GROWSDOWN' : 0x01000000,
274+
'PROT_GROWSUP' : 0x02000000
273275
}
274276

275277
return _constant_mapping(prots, mmap_prots)
276278

277279

278280
def socket_type_mapping(t, arch):
279281
socket_type_map = {
280-
QL_ARCH.X86: linux_socket_types,
281-
QL_ARCH.X8664: linux_socket_types,
282-
QL_ARCH.ARM: arm_socket_types,
283-
QL_ARCH.ARM_THUMB: arm_socket_types,
284-
QL_ARCH.ARM64: arm_socket_types,
285-
QL_ARCH.MIPS: mips_socket_types,
286-
QL_OS.MACOS: linux_socket_types,
287-
}.get(arch)
282+
QL_ARCH.X86: linux_socket_types,
283+
QL_ARCH.X8664: linux_socket_types,
284+
QL_ARCH.ARM: arm_socket_types,
285+
QL_ARCH.ARM_THUMB: arm_socket_types,
286+
QL_ARCH.ARM64: arm_socket_types,
287+
QL_ARCH.MIPS: mips_socket_types,
288+
QL_OS.MACOS: linux_socket_types,
289+
}[arch]
290+
288291
# https://code.woboq.org/linux/linux/net/socket.c.html#1363
289292
t &= SOCK_TYPE_MASK
293+
290294
return _constant_mapping(t, socket_type_map, single_mapping=True)
291295

292296

293297
def socket_domain_mapping(p, arch):
294298
socket_domain_map = {
295-
QL_ARCH.X86: linux_socket_domain,
296-
QL_ARCH.X8664: linux_socket_domain,
297-
QL_ARCH.ARM: arm_socket_domain,
298-
QL_ARCH.ARM_THUMB: arm_socket_domain,
299-
QL_ARCH.ARM64: arm_socket_domain,
300-
QL_ARCH.MIPS: mips_socket_domain,
301-
QL_OS.MACOS: macos_socket_domain,
302-
}.get(arch)
299+
QL_ARCH.X86: linux_socket_domain,
300+
QL_ARCH.X8664: linux_socket_domain,
301+
QL_ARCH.ARM: arm_socket_domain,
302+
QL_ARCH.ARM_THUMB: arm_socket_domain,
303+
QL_ARCH.ARM64: arm_socket_domain,
304+
QL_ARCH.MIPS: mips_socket_domain,
305+
QL_OS.MACOS: macos_socket_domain,
306+
}[arch]
303307

304308
return _constant_mapping(p, socket_domain_map, single_mapping=True)
305309

306310

307311
def socket_level_mapping(t, arch):
308312
socket_level_map = {
309-
QL_ARCH.X86: linux_socket_level,
310-
QL_ARCH.X8664: linux_socket_level,
311-
QL_ARCH.ARM: arm_socket_level,
312-
QL_ARCH.ARM_THUMB: arm_socket_level,
313-
QL_ARCH.ARM64: arm_socket_level,
314-
QL_ARCH.MIPS: mips_socket_level,
315-
QL_OS.MACOS: linux_socket_level,
316-
}.get(arch)
313+
QL_ARCH.X86: linux_socket_level,
314+
QL_ARCH.X8664: linux_socket_level,
315+
QL_ARCH.ARM: arm_socket_level,
316+
QL_ARCH.ARM_THUMB: arm_socket_level,
317+
QL_ARCH.ARM64: arm_socket_level,
318+
QL_ARCH.MIPS: mips_socket_level,
319+
QL_OS.MACOS: linux_socket_level,
320+
}[arch]
317321

318322
return _constant_mapping(t, socket_level_map, single_mapping=True)
319323

@@ -327,20 +331,20 @@ def socket_ip_option_mapping(t, arch):
327331
QL_ARCH.ARM64: linux_socket_ip_options,
328332
QL_ARCH.MIPS: mips_socket_ip_options,
329333
QL_OS.MACOS: macos_socket_ip_options,
330-
}.get(arch)
334+
}[arch]
331335

332336
return _constant_mapping(t, socket_option_map, single_mapping=True)
333337

334338

335339
def socket_option_mapping(t, arch):
336340
socket_option_map = {
337-
QL_ARCH.X86: linux_socket_options,
338-
QL_ARCH.X8664: linux_socket_options,
339-
QL_ARCH.ARM: arm_socket_options,
340-
QL_ARCH.ARM_THUMB: arm_socket_options,
341-
QL_ARCH.ARM64: arm_socket_options,
342-
QL_ARCH.MIPS: mips_socket_options,
343-
QL_OS.MACOS: linux_socket_options,
344-
}.get(arch)
341+
QL_ARCH.X86: linux_socket_options,
342+
QL_ARCH.X8664: linux_socket_options,
343+
QL_ARCH.ARM: arm_socket_options,
344+
QL_ARCH.ARM_THUMB: arm_socket_options,
345+
QL_ARCH.ARM64: arm_socket_options,
346+
QL_ARCH.MIPS: mips_socket_options,
347+
QL_OS.MACOS: linux_socket_options,
348+
}[arch]
345349

346350
return _constant_mapping(t, socket_option_map, single_mapping=True)

0 commit comments

Comments
 (0)