Skip to content

Commit 15d4efe

Browse files
committed
Refine auxv handling code
1 parent 486e14d commit 15d4efe

File tree

1 file changed

+35
-98
lines changed

1 file changed

+35
-98
lines changed

qiling/debugger/gdb/gdb.py

Lines changed: 35 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -506,106 +506,43 @@ def handle_q(subcmd):
506506
elif subcmd.startswith('Xfer:auxv:read::'):
507507
if self.ql.code:
508508
return
509-
if self.ql.ostype in (QL_OS.LINUX, QL_OS.FREEBSD) :
510-
if self.ql.archbit == 64:
511-
ANNEX = "00000000000000"
512-
AT_SYSINFO_EHDR = "0000000000000000" # System-supplied DSO's ELF header
513-
ID_AT_HWCAP = "1000000000000000"
514-
ID_AT_PAGESZ = "0600000000000000"
515-
ID_AT_CLKTCK = "1100000000000000"
516-
AT_CLKTCK = "6400000000000000" # Frequency of times() 100
517-
ID_AT_PHDR = "0300000000000000"
518-
ID_AT_PHENT = "0400000000000000"
519-
ID_AT_PHNUM = "0500000000000000"
520-
ID_AT_BASE = "0700000000000000"
521-
ID_AT_FLAGS = "0800000000000000"
522-
ID_AT_ENTRY = "0900000000000000"
523-
ID_AT_UID = "0b00000000000000"
524-
ID_AT_EUID = "0c00000000000000"
525-
ID_AT_GID = "0d00000000000000"
526-
ID_AT_EGID = "0e00000000000000"
527-
ID_AT_SECURE = "1700000000000000"
528-
AT_SECURE = "0000000000000000"
529-
ID_AT_RANDOM = "1900000000000000"
530-
ID_AT_HWCAP2 = "1a00000000000000"
531-
AT_HWCAP2 = "0000000000000000"
532-
ID_AT_EXECFN = "1f00000000000000"
533-
AT_EXECFN = "0000000000000000" # File name of executable
534-
ID_AT_PLATFORM = "0f00000000000000"
535-
ID_AT_NULL = "0000000000000000"
536-
AT_NULL = "0000000000000000"
537-
538-
elif self.ql.archbit == 32:
539-
ANNEX = "000000"
540-
AT_SYSINFO_EHDR = "00000000" # System-supplied DSO's ELF header
541-
ID_AT_HWCAP = "10000000"
542-
ID_AT_PAGESZ = "06000000"
543-
ID_AT_CLKTCK = "11000000"
544-
AT_CLKTCK = "64000000" # Frequency of times() 100
545-
ID_AT_PHDR = "03000000"
546-
ID_AT_PHENT = "04000000"
547-
ID_AT_PHNUM = "05000000"
548-
ID_AT_BASE = "07000000"
549-
ID_AT_FLAGS = "08000000"
550-
ID_AT_ENTRY = "09000000"
551-
ID_AT_UID = "0b000000"
552-
ID_AT_EUID = "0c000000"
553-
ID_AT_GID = "0d000000"
554-
ID_AT_EGID = "0e000000"
555-
ID_AT_SECURE = "17000000"
556-
AT_SECURE = "00000000"
557-
ID_AT_RANDOM = "19000000"
558-
ID_AT_HWCAP2 = "1a000000"
559-
AT_HWCAP2 = "00000000"
560-
ID_AT_EXECFN = "1f000000"
561-
AT_EXECFN = "00000000" # File name of executable
562-
ID_AT_PLATFORM = "0f000000"
563-
ID_AT_NULL = "00000000"
564-
AT_NULL = "00000000"
565-
566-
AT_HWCAP = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_HWCAP]) # mock cpuid 0x1f8bfbff
567-
AT_PAGESZ = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_PAGESZ]) # System page size, fixed in qiling
568-
AT_PHDR = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_PHDR]) # Program headers for program
569-
AT_PHENT = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_PHENT]) # Size of program header entry
570-
AT_PHNUM = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_PHNUM]) # Number of program headers
571-
AT_BASE = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_BASE]) # Base address of interpreter
572-
AT_FLAGS = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_FLAGS])
573-
AT_ENTRY = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_ENTRY]) # Entry point of program
574-
AT_UID = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_UID]) # UID from ql.profile
575-
AT_EUID = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_EUID]) # UID from ql.profile
576-
AT_GID = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_GID]) # UID from ql.profile
577-
AT_EGID = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_EGID]) # UID from ql.profile
578-
AT_RANDOM = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_RANDOM]) # Address of 16 random bytes
579-
AT_PLATFORM = self.addr_to_str(self.ql.loader.aux_vec[AUX.AT_PLATFORM]) # String identifying platform
580-
581-
auxvdata_c = (
582-
ANNEX + AT_SYSINFO_EHDR +
583-
ID_AT_HWCAP + AT_HWCAP +
584-
ID_AT_PAGESZ + AT_PAGESZ +
585-
ID_AT_CLKTCK + AT_CLKTCK +
586-
ID_AT_PHDR + AT_PHDR +
587-
ID_AT_PHENT + AT_PHENT +
588-
ID_AT_PHNUM + AT_PHNUM +
589-
ID_AT_BASE + AT_BASE +
590-
ID_AT_FLAGS + AT_FLAGS +
591-
ID_AT_ENTRY + AT_ENTRY +
592-
ID_AT_UID + AT_UID +
593-
ID_AT_EUID + AT_EUID +
594-
ID_AT_GID + AT_GID +
595-
ID_AT_EGID + AT_EGID +
596-
ID_AT_SECURE + AT_SECURE +
597-
ID_AT_RANDOM + AT_RANDOM +
598-
ID_AT_HWCAP2 + AT_HWCAP2 +
599-
ID_AT_EXECFN + AT_EXECFN +
600-
ID_AT_PLATFORM + AT_PLATFORM +
601-
ID_AT_NULL + AT_NULL
602-
)
603-
604-
auxvdata = self.bin_to_escstr(unhexlify(auxvdata_c))
605-
#self.send(b'l!%s' % auxvdata)
509+
510+
if self.ql.ostype in (QL_OS.LINUX, QL_OS.FREEBSD):
511+
def __read_auxv() -> Iterator[int]:
512+
auxv_entries = (
513+
AUX.AT_HWCAP,
514+
AUX.AT_PAGESZ,
515+
AUX.AT_CLKTCK,
516+
AUX.AT_PHDR,
517+
AUX.AT_PHENT,
518+
AUX.AT_PHNUM,
519+
AUX.AT_BASE,
520+
AUX.AT_FLAGS,
521+
AUX.AT_ENTRY,
522+
AUX.AT_UID,
523+
AUX.AT_EUID,
524+
AUX.AT_GID,
525+
AUX.AT_EGID,
526+
AUX.AT_SECURE,
527+
AUX.AT_RANDOM,
528+
AUX.AT_HWCAP2,
529+
AUX.AT_EXECFN,
530+
AUX.AT_PLATFORM,
531+
AUX.AT_NULL
532+
)
533+
534+
for e in auxv_entries:
535+
yield e.value
536+
yield self.ql.loader.aux_vec[e]
537+
538+
annex = self.addr_to_str(0)[:-2]
539+
sysinfo_ehdr = self.addr_to_str(0)
540+
541+
auxvdata_c = unhexlify(''.join([annex, sysinfo_ehdr] + [self.addr_to_str(val) for val in __read_auxv()]))
542+
auxvdata = self.bin_to_escstr(auxvdata_c)
606543
else:
607544
auxvdata = b""
608-
545+
609546
self.send(b'l!%s' % auxvdata)
610547

611548
elif subcmd.startswith('Xfer:exec-file:read:'):

0 commit comments

Comments
 (0)