@@ -406,47 +406,29 @@ def dstr(self):
406406 prefix_len = bs * 2 + 2
407407 prefix = " " * prefix_len
408408
409- # build a lookup map for sigreturn frame values
410- # key: index in _values, value: (frame_object, register_name)
411- sigreturn_map = {}
409+ sigreturn_map = {} # start_offset -> frame and end offset
412410 for frame , start_offset in self ._sigreturn_frames :
413- # iterate through frame registers to build the map
411+ # iterate through frame registers to build a map
414412 frame_words = frame .to_words ()
415- for i , word_value in enumerate (frame_words ):
416- value_idx = start_offset + i
417- if value_idx < len (self ._values ):
418- # find which register this word belongs to
419- offset_in_bytes = i * frame .word_size
420- for reg_offset , reg_name in frame ._registers .items ():
421- if reg_offset == offset_in_bytes :
422- sigreturn_map [value_idx ] = (frame , reg_name , word_value )
423- break
424-
425- for idx , v in enumerate (self ._values ):
413+ sigreturn_map [start_offset ] = (frame , start_offset + len (frame_words ))
414+ idx = 0
415+ while idx < len (self ._values ):
416+ v = self ._values [idx ]
426417 if v .symbolic :
427418 res += prefix + f" { v .ast } \n "
419+ idx += 1
428420 continue
429421 for g in self ._gadgets :
430422 if g .addr == v .concreted :
431423 fmt = f"%#0{ prefix_len } x"
432424 res += fmt % g .addr + f": { g .dstr ()} \n "
433425 break
434426 else :
435- # check if this value belongs to a sigreturn frame
436427 if idx in sigreturn_map :
437- frame , reg_name , _ = sigreturn_map [idx ]
438- concrete_val = v .concreted
439- # only show if value is non-zero or it's a critical register
440- # critical registers: rip/rsp/pc/sp
441- is_critical = reg_name in (
442- self ._p .arch .register_names [self ._p .arch .ip_offset ],
443- self ._p .arch .register_names [self ._p .arch .sp_offset ],
444- )
445- is_nonzero = concrete_val != 0
446- if is_critical or is_nonzero :
447- res += prefix + f"[sigreturn frame] { reg_name } : { concrete_val :#x} \n "
448- else :
449- res += prefix + f" { v .concreted :#x} \n "
428+ sigframe , idx = sigreturn_map [idx ]
429+ res += sigframe .dstr (prefix = prefix )
430+ continue
431+ idx += 1
450432 return res
451433
452434 def pp (self ):
0 commit comments