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

时间:2019-03-28 16:25:51

标签: python radare2

我将要编写一个将二进制文件放入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中使用它,但是我做的方式,main,入口点和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*'))

1 个答案:

答案 0 :(得分:2)

环境

  • radare2: radare2 4.2.0-git 23519 @ linux-x86-64 git.4.1.1-84-g0c46c3e1e commit:0c46c3e1e30bb272a5a05fc367d874af32b41fe4 build:2020-01-08__09:49:0
  • 系统: Ubuntu 18.04.3 LTS

解决方案

  • 这可以通过从命令提示符或支持r2pipe的语言使用两个radare2命令来实现。
    • 命令一:aaaa#分析文件
    • 命令二:pdf @@ f>输出
      • 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