用radare2`w`写一个文件?

逆向工程 雷达2
2021-07-01 02:17:33

Radare2 支持w写入字符串的 a。

w foobar             write string 'foobar'

然而,它似乎对我不起作用,

$ touch foo

$ radare2 ./foo
w foobar

该文件foo保持为空。我应该冲洗还是保存?

3个回答

TLDR

  • radare2read-only mode默认情况下打开一个文件r2 -h有关更多信息,请参阅手册。)
  • 要允许写入文件,请在write mode( r2 -w file) 中启动radare2
  • read-only session已经在 a 时oo+模式下重新打开文件write
  • cache modee io.cache=true)模仿写访问,但变化radare2实际上并没有写入磁盘

写入模式 - 示例


  1. foowrite mode以下位置打开文件
    $ r2 -w foo
    

  1. 打印 32 个字节(带px 32):
    [0x00000000]> px 32
    - offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF
    0x00000000  ffff ffff ffff ffff ffff ffff ffff ffff  ................
    0x00000010  ffff ffff ffff ffff ffff ffff ffff ffff  ................
    

注意:前 32 个字节(以及文件的其余部分)为空。


  1. 让我们写下“Hello World!” 进入文件:

    [0x00000000]> w Hello World!
    
  2. 并再次打印 32 个字节:

    [0x00000000]> px 32
    - offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF
    0x00000000  4865 6c6c 6f20 576f 726c 6421 ffff ffff  Hello World!....
    0x00000010  ffff ffff ffff ffff ffff ffff ffff ffff  ................
    

伟大的!现在我们可以看到“Hello World!” 被写入文件。


  1. 让我们退出radare2和cat文件以查看内容:
     [0x00000000]> q
    
    $ cat foo
    Hello World!
    

缓存模式 - 示例

  1. foo以写模式打开文件
    $ r2 foo
    
  2. 打印前 32 个字节@
    [0x00000000]> px 32
    - offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF
    0x00000000  4865 6c6c 6f20 576f 726c 6421 ffff ffff  Hello World!....
    0x00000010  ffff ffff ffff ffff ffff ffff ffff ffff  ................
    
  3. 激活“缓存模式”:
    [0x00000000]> e io.cache=true
    
  4. 在radare2中做一些改变:
    [0x00000000]> w Goodbyte World! :)
    
  5. 证明radare2模仿写作就像在write mode
    [0x00000000]> px 32
    - offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF
    0x00000000  476f 6f64 6279 7465 2057 6f72 6c64 2120  Goodbyte World!
    0x00000010  3a29 ffff ffff ffff ffff ffff ffff ffff  :)..............
    
  6. 退出radare2:
    [0x00000000]> q
    
  7. 检查实际文件内容:
    $ cat foo
    Hello World!
    
    注意:文件没有改变!这就是 的效果cache mode

只是为了更新@Megabeets 的答案。

当您从一个空文件(由 创建touch)开始时,w默认情况下命令将不起作用,即使r2将以write模式启动在这种情况下,缺失的信息是映射

[0x00000000]> om
[0x00000000]

返回空结果。除了列出,该om命令还可用于创建映射:

Usage: om[-] [arg]   # map opened files
| om                                       list all defined IO maps
...
| om fd vaddr [size] [paddr] [rwx] [name]  create new io map
...

为了进行映射,需要指定(例如)以下命令

[0x00000000]> om 3 0x0 12
[0x00000000]> om
 1 fd: 3 +0x00000000 0x00000000 - 0x0000000b rwx

这将为文件描述 3 创建一个从地址 0x0 开始的 12 字节大小的映射。

之后w将工作:

[0x00000000]> w Hello world!
[0x00000000]> px 32
- offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF
0x00000000  4865 6c6c 6f20 776f 726c 6421 ffff ffff  Hello world!....
0x00000010  ffff ffff ffff ffff ffff ffff ffff ffff  ................
[0x00000000]>

创建输入/输出映射以允许写入非映射文件

允许写入可达64 byte开始offset 0x00000000,在radare2图的变化file descriptor 3(在radare2打开的文件)。

[0x00000000]> om 3 0x0 64
[0x00000000]> om
1 fd: 3 +0x00000000 0x00000000 - 0x0000000b rwx

解释

空文件(由 创建touch没有输入/输出映射(即使使用 in 打开write mode)。要确认没有映射区域,您可以使用radare2-command 列出所有定义的IO 映射om。)

要使用om参数创建 i/o 映射使用

om fd vaddr [size] [paddr] [rwx] [name] 创建新的 io 映射

例子

radare2 -w test_file
 -- 已经执行的不能不执行
[0x00000000]> w 这不会被写入任何地方,因为不存在映射。
[0x00000000]> om
[0x00000000]> om 3 0 64
[0x00000000]> om
 1 fd: 3 +0x00000000 0x00000000 - 0x0000003f rwx 
[0x00000000]> w 你好世界!
[0x00000000]> V

映射和写入后文件的十六进制视图