如何使用radare获得符号可见性?

逆向工程 雷达2 小精灵 符号
2021-07-01 08:35:27

用 NASM创建了一个快速的x86_64 程序集文件为 ELF 64生成四种不同的可见性类随着readelf --symbols列中获得符号可见性VisDEFAULT, INTERNAL, HIDDEN, PROTECTED

Symbol table '.symtab' contains 16 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     4: 000000000040007e     0 OBJECT  GLOBAL PROTECTED    1 gdp
     5: 0000000000400082     0 FUNC    GLOBAL HIDDEN     2 gfh
     6: 000000000040007a     0 OBJECT  GLOBAL INTERNAL    1 gdi
     8: 000000000040007c     0 OBJECT  GLOBAL HIDDEN     1 gdh
     9: 0000000000400083     0 FUNC    GLOBAL PROTECTED    2 gfp
    11: 0000000000400078     0 OBJECT  GLOBAL DEFAULT    1 gdd
    14: 0000000000400081     0 FUNC    GLOBAL INTERNAL    2 gfi
    15: 0000000000400080     0 FUNC    GLOBAL DEFAULT    2 gfd

这些符号被编码为

  • 第一个字符:g表示它们是GLOBALNASM)——它们都是。
  • 中间字符:f表示它们是“函数”,d表示它们是数据
  • 最后一个字符:default、内部ihidden、protected。

但是,使用radare我无法弄清楚如何查看readelf --symbols显示可用的可见性使用fs symbols; f

0x0040007e 0 obj.gdp
0x00400082 0 sym.gfh
0x0040007a 0 obj.gdi
0x0040007c 0 obj.gdh
0x00400083 0 sym.gfp
0x00400078 0 obj.gdd
0x00400081 0 sym.gfi
0x00400080 0 sym.gfd

显然,sym是函数,obj是数据。但是我怎样才能让雷达向我展示能见度呢?

1个回答

afaik,符号可见性在radare2 中不可用。与此最接近的是符号绑定和类型。您可以使用is负责显示符号命令来执行此操作

$ r2 /bin/echo
 -- What do you want to debug today?
[0x00401800]> is
[Symbols]
050 0x00007228 0x00607228 GLOBAL    OBJ    8 stdout
051 0x00007220 0x00607220 GLOBAL    OBJ    8 program_invocation_short_name
052 0x00007230 0x00607230   WEAK    OBJ    8 __progname_full
053 0x00007230 0x00607230 GLOBAL    OBJ    8 __progname_full
054 0x00007220 0x00607220   WEAK    OBJ    8 program_invocation_short_name
055 0x00007240 0x00607240 GLOBAL    OBJ    8 stderr
001 0x00001070 0x00401070 GLOBAL   FUNC   16 imp.__uflow
002 0x00001080 0x00401080 GLOBAL   FUNC   16 imp.getenv
003 0x00001090 0x00401090 GLOBAL   FUNC   16 imp.free
...
026 0x00001200 0x00401200 GLOBAL   FUNC   16 imp.calloc
027 0x00001210 0x00401210 GLOBAL   FUNC   16 imp.strcmp
028 0x00000000 0x00400000   WEAK NOTYPE   16 imp.__gmon_start__
029 0x00001220 0x00401220 GLOBAL   FUNC   16 imp.memcpy
...

您还可以通过附加j~{}到命令以格式化的 Json 格式打印它

[0x00401800]> isj~{}
[
  {
    "name": "stdout",
    "demname": "",
    "flagname": "obj.stdout",
    "ordinal": 50,
    "bind": "GLOBAL",
    "size": 8,
    "type": "OBJ",
    "vaddr": 6320680,
    "paddr": 29224
  },
  {
    "name": "program_invocation_short_name",
    "demname": "",
    "flagname": "obj.program_invocation_short_name",
    "ordinal": 51,
    "bind": "GLOBAL",
    "size": 8,
    "type": "OBJ",
    "vaddr": 6320672,
    "paddr": 29216
  },
  {
    "name": "__progname_full",
    "demname": "",
    "flagname": "obj.__progname_full",
    "ordinal": 52,
    "bind": "WEAK",
    "size": 8,
    "type": "OBJ",
    "vaddr": 6320688,
    "paddr": 29232
  },