23 Flags
Flags are conceptually similar to bookmarks. They associate a name with a given offset in a file. Flags can be grouped into ‘flagspaces’. A flagspace is a namespace for flags, grouping together flags of similar characteristics or type. Examples for flagspaces: sections, registers or symbols.
To create a flag:
[0x100003ba0]> f flag_name @ offset
You can remove a flag by appending the -
character to command. Most commands accept -
as argument-prefix as an indication to delete something.
[0x100003ba0]> f-flag_name
To switch between or create new flagspaces use the fs
command:
[0x100003ba0]> fs?
Usage: fs[l-mrs?] # Manage flagspaces
| fs <name> # Add the flagspace
| fsl[jq] # Display flagspaces
| fs- <name> # Remove the flagspace
| fs-* # Remove all flagspaces
| fsm # Move the flags at the current address to the current flagspace
| fsr <newname> # Rename the flag space
| fss<+-l> # Manage the flagspace stack
[0x100003ba0]> fsl
| 0 * classes
| 108 * functions
| 84 * imports
| 0 * platform.ports
| 87 * pointers
| 0 * registers
| 0 * registers.extended
| 0 * registers.mmio
| 91 * relocs
| 13 * sections
| 3 * segments
| 95 * strings
| 55 * symbols
Here you can find some command examples using flagspaces:
[0x100003ba0]> fs symbols ; select only flags in symbols flagspace
[0x100003ba0]> fsl
0 . classes
108 . functions
84 . imports
0 . platform.ports
87 . pointers
0 . registers
0 . registers.extended
0 . registers.mmio
91 . relocs
13 . sections
3 . segments
95 . strings
55 * symbols ; symbols are selected
[0x100003ba0]> fl ; list only flags in symbols flagspace
[0x100003ba0]> fs * ; select all flagspaces
[0x100003ba0]> f myflag ; create a new flag called 'myflag'
[0x100003ba0]> f-myflag ; delete the flag called 'myflag'
You can rename flags with fr
.
23.0.1 Local flags
Every flag name should be unique for addressing reasons. But it is quite a common need to have the flags, for example inside the functions, with simple and ubiquitous names like loop
or return
. For this purpose you can use so called “local” flags, which are tied to the function where they reside. It is possible to add them using f.
command:
[0x00003a04]> pd 10
│ 0x00003a04 48c705c9cc21. mov qword [0x002206d8], 0xffffffffffffffff ;
[0x2206d8:8]=0
│ 0x00003a0f c60522cc2100. mov byte [0x00220638], 0 ; [0x220638:1]=0
│ 0x00003a16 83f802 cmp eax, 2
│ .─< 0x00003a19 0f84880d0000 je 0x47a7
│ │ 0x00003a1f 83f803 cmp eax, 3
│ .──< 0x00003a22 740e je 0x3a32
│ ││ 0x00003a24 83e801 sub eax, 1
│.───< 0x00003a27 0f84ed080000 je 0x431a
││││ 0x00003a2d e8fef8ffff call sym.imp.abort ; void abort(void)
││││ ; CODE XREF from main (0x3a22)
││╰──> 0x00003a32 be07000000 mov esi, 7
[0x00003a04]> f. localflag @ 0x3a32
[0x00003a04]> f.
0x00003a32 localflag [main + 210]
[0x00003a04]> pd 10
│ 0x00003a04 48c705c9cc21. mov qword [0x002206d8], 0xffffffffffffffff ;
[0x2206d8:8]=0
│ 0x00003a0f c60522cc2100. mov byte [0x00220638], 0 ; [0x220638:1]=0
│ 0x00003a16 83f802 cmp eax, 2
│ .─< 0x00003a19 0f84880d0000 je 0x47a7
│ │ 0x00003a1f 83f803 cmp eax, 3
│ .──< 0x00003a22 740e je 0x3a32 ; main.localflag
│ ││ 0x00003a24 83e801 sub eax, 1
│.───< 0x00003a27 0f84ed080000 je 0x431a
││││ 0x00003a2d e8fef8ffff call sym.imp.abort ; void abort(void)
││││ ; CODE XREF from main (0x3a22)
││`──> .localflag:
││││ ; CODE XREF from main (0x3a22)
││`──> 0x00003a32 be07000000 mov esi, 7
[0x00003a04]>
23.0.2 Flag Zones
Rizin offers flag zones, which lets you label different offsets on the scrollbar, for making it easier to navigate through large binaries. You can set a flag zone on the current seek using:
[0x00003a04]> fz flag-zone-name
Set e scr.scrollbar=1
and go to the Visual mode, to see your flag zone appear on the scrollbar on the right end of the window.
See fz?
for more information.