如何使用 r2pipe 转储函数的反汇编

How to dump function's disassembly using r2pipe

我打算编写一个软件,将二进制文件放入 radare2,然后将包括指令、地址和指令的二进制表示的子程序转储到文本文件中。

我用 IDA Pro 和 IDAPython 得到了它,但我也想为 radare2 重新创建它。文本文件最终应如下所示:

0x0804ba0a      55             push ebp
0x0804ba0b      89e5           mov ebp, esp
0x0804ba0d      83ec18         sub esp, 0x18
0x0804ba10      83e4f0         and esp, 0xfffffff0
0x0804ba13      b800000000     mov eax, 0
0x0804ba18      29c4           sub esp, eax

不幸的是,网络上的资源很少,文档也不长。我很想给你更多的工作,但我不知何故被困在这里。 我想出了如何使用 pdf 命令反汇编一个函数,我可能会像这样在 python 中使用它,但我这样做的方式,主要的入口点和 sym.main 会丢失。我想反汇编整个 .text 部分或 .text 部分中的所有函数:

import r2pipe

file = 'path_to_file'
r = r2pipe.open()

with open (file, 'w') as f:
    r.cmd('aaa')
    # disassemble all functions starting with fcn and write them
    # to the file
    f.write(r.cmd('pdf @@ fcn*'))

环境

  • radare2:radare2 4.2.0-git23519@linux-x86-64git.4.1.1-84- g0c46c3e1e 提交:0c46c3e1e30bb272a5a05fc367d874af32b41fe4 构建:2020-01-08__09:49:0
  • 系统: Ubuntu 18.04.3 LTS

解决方案

  • 这可以通过命令提示符或支持 r2pipe 的语言使用两个 radare2 命令来实现。
    • 命令一:aaaa # 分析文件
    • 命令二:pdf @@f > out
      • pdf # 打印函数的反汇编
      • @@f # 对每个函数重复命令
      • > out # 将输出重定向到名为 out
      • 的文件

示例

使用 radare2 的示例 shell

user@host:~$ r2 /bin/ls
[0x00005850]> aaaa
...
[0x00005850]> pdf @@f > out
[0x00005850]> q
user@host:~$ cat out
...
┌ 38: fcn.00014840 ();
│           ; var int64_t var_38h @ rsp+0xffffffd0
│           0x00014840      53             push rbx
│           0x00014841      31f6           xor esi, esi
│           0x00014843      31ff           xor edi, edi
│           0x00014845      e846f2feff     call sym.imp.getcwd
│           0x0001484a      4885c0         test rax, rax
│           0x0001484d      4889c3         mov rbx, rax
│       ┌─< 0x00014850      740e           je 0x14860
│       │   ; CODE XREF from fcn.00014840 @ 0x14868
│      ┌──> 0x00014852      4889d8         mov rax, rbx
│      ╎│   0x00014855      5b             pop rbx
│      ╎│   0x00014856      c3             ret
..
│      ╎│   ; CODE XREF from fcn.00014840 @ 0x14850
│      ╎└─> 0x00014860      e88beffeff     call sym.imp.__errno_location
│      ╎    0x00014865      83380c         cmp dword [rax], 0xc
│      └──< 0x00014868      75e8           jne 0x14852
└           0x0001486a      e861feffff     call fcn.000146d0
            ; CALL XREFS from fcn.00013d00 @ 0x13d9d, 0x13da8
...

使用 Python 和 r2pipe

的示例
import r2pipe

R2 = r2pipe.open('/bin/ls') # Open r2 with file
R2.cmd('aaaa')              # Analyze file
R2.cmd('pdf @@f > out')     # Write disassembly for each function to out file
R2.quit()                   # Quit r2