如何使用radare 的打印格式`pf` 打印固定宽度的字符串?

逆向工程 雷达2 字符串
2021-06-10 19:05:44

假设我有一个字节序列,其中U是一个 unsigned int(4 个字节),ccccccccccccccc一个 15 字节的字符数组

UcccccccccccccccU

是否可以使用 打印此结构pf我可以打印这个

pf i;
ps 15 @ 4;
pf i @ 19;

如果这两个整数彼此相邻,我可以做pf ii,而我想做的是类似的事情pf is15i- 这不起作用,因为s* char[]字符串,而不是字符数组。

如果我做类似的事情pf 5c,我会将它们输出为单个字符(例如,)

0x00000008 [0] {
  0x00000008 = '6'
}
0x00000009 [1] {
  0x00000009 = '0'
}
0x0000000a [2] {
  0x0000000a = '0'
}
1个回答

要了解如何以pf您想要的方式使用,我们应该一步一步地进行检查。

我为一个radare2游乐场打开了一个空白的记忆:

$ r2 malloc://200
[0x00000000]>

接下来,受您示例的启发,我在此操场上写了日期:

[0x00000000]> wx AABBCCDD @ 0
[0x00000000]> w ccccccccccccccc @ 4
[0x00000000]> wx 11223344 @ 19

基本上,我写了 4 个字节,然后是 15 个字符,然后是其他 4 个字节。这是它在内存中的样子:

[0x00000000]> px 32
- offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF
0x00000000  aabb ccdd 6363 6363 6363 6363 6363 6363  ....cccccccccccc
0x00000010  6363 6311 2233 4400 0000 0000 0000 0000  ccc."3D.........

为了打印这个结构,我做了这样的事情:

[0x00000000]> pf x[15]zx
0x00000000 = 0xddccbbaa
0x00000004 = ccccccccccccccc
0x00000013 = 0x44332211

如您所知,pf用于打印格式化数据。通过使用pf??和,pf???您可以查看示例并理解我的命令的每个部分。

如果要打印整数,可以使用i代替x

[0x00000000]> pf i[15]zi 1st 2nd third
   1st : 0x00000000 = -573785174
   2nd : 0x00000004 = ccccccccccccccc
 third : 0x00000013 = 1144201745

我的结构由4部分组成:

  • pf 命令
  • x在哪里x用于打印十六进制值(4 个字节)
  • [15]z 打印字符串的 15 个字符
  • x 打印另一个十六进制值

您还可以命名字段:

[0x00000000]> pf x[15]zx 1st 2nd third
   1st : 0x00000000 = 0xddccbbaa
   2nd : 0x00000004 = ccccccccccccccc
 third : 0x00000013 = 0x44332211

您可以使用其他格式字符,例如e交换字节序等