定位

定位(跳转)

为了移动我们正在检查的文件,我们将需要使用s命令更改偏移量。该参数是一个数学表达式,可以包含标志名称,括号,加法,减法,乘积,以及使用方括号获取到的对应内存地址上的数据。

下面是一些示例命令,注意观察偏移量如何变化。:

[0x00000000]> s 0x10
[0x00000010]> s+4
[0x00000014]> s-
[0x00000010]> s+
[0x00000014]>

第一行将当前偏移量移至地址0x10。

第二个是相对当前位置,向后偏移4个字节。

最后的2个命令分别是撤消前面的操作和重做最后一个查找操作。

我们不仅可以使用数字,还可以使用复杂的表达式或基本的算术运算来表示要查找的地址。请查看?$?帮助消息,里面描述了可以在表达式中使用的内部变量, 例如下面的表达式与s + 4是相同的:

[0x00000000]> s $$+4

在调试器中(或在仿真时),我们还可以将寄存器名称用作引用。通过.dr*命令将寄存器名称作为标志加载,该命令会在后台运行。

[0x00000000]> s rsp+0x40

下面是关于s命令的帮助信息,之后将详细介绍它。

[0x00000000]> s?
Usage: s    # Help for the seek commands. See ?$? to see all variables
| s                 Print current address
| s.hexoff          Seek honoring a base from core->offset
| s:pad             Print current address with N padded zeros (defaults to 8)
| s addr            Seek to address
| s-                Undo seek
| s-*               Reset undo seek history
| s- n              Seek n bytes backward
| s--[n]            Seek blocksize bytes backward (/=n)
| s+                Redo seek
| s+ n              Seek n bytes forward
| s++[n]            Seek blocksize bytes forward (/=n)
| s[j*=!]           List undo seek history (JSON, =list, *r2, !=names, s==)
| s/ DATA           Search for next occurrence of 'DATA'
| s/x 9091          Search for next occurrence of \x90\x91
| sa [[+-]a] [asz]  Seek asz (or bsize) aligned to addr
| sb                Seek aligned to bb start
| sC[?] string      Seek to comment matching given string
| sf                Seek to next function (f->addr+f->size)
| sf function       Seek to address of specified function
| sf.               Seek to the beginning of current function
| sg/sG             Seek begin (sg) or end (sG) of section or file
| sl[?] [+-]line    Seek to line
| sn/sp ([nkey])    Seek to next/prev location, as specified by scr.nkey
| so [N]            Seek to N next opcode(s)
| sr pc             Seek to register
| ss                Seek silently (without adding an entry to the seek history)

> 3s++        ; 3 times block-seeking
> s 10+0x80   ; seek at 0x80+10

如果要检查数学表达式的结果,可以使用命令对其求值。只需将表达式作为参数传递。结果可以以十六进制,十进制,八进制或二进制格式显示。

> ? 0x100+200
0x1C8 ; 456d ; 710o ; 1100 1000

“?”子命令能以一种特定格式(以10为基数,以16为底数...)显示输出。参见?v?vi

在可视化模式下,您可以在搜索历史记录中按u(撤消)或U(重做)以返回到上一个位置或前进到下一个位置。

打开文件

我们使用以Linux ELF格式编译的简单hello_world.c作为测试文件,编译之后,让我们用radare2打开它:

$ r2 hello_world

现在命令行提示符已经成功显示:

[0x00400410]>

是时候向更深处进击了。

定位到任意的地址

所有接受地址作为命令参数的查找命令都可以使用任意进制,例如十六进制,八进制,二进制或十进制。定位到地址0x0的一个简便命令就是0x0

[0x00400410]> s 0x0
[0x00000000]>

显示当前地址:

[0x00000000]> s
0x0
[0x00000000]>

显示当前地址的另一个方法是使用:?v $$

可以像下面这样向地址高位跳转N个位置, 有没有空格都无所谓:

[0x00000000]> s+ 128
[0x00000080]>

撤销前两个seek操作,回到最初地址:

[0x00000080]> s-
[0x00000000]> s-
[0x00400410]>

现在,我们回到了0x00400410, 下面的命令可以展示我们的seek历史。

[0x00400410]> s*
f undo_3 @ 0x400410
f undo_2 @ 0x40041a
f undo_1 @ 0x400410
f undo_0 @ 0x400411
# Current undo/redo position.
f redo_0 @ 0x4005b4

最后更新于

这有帮助吗?