Python 如何转储函数';使用R2S管进行拆卸

Python 如何转储函数';使用R2S管进行拆卸,python,radare2,Python,Radare2,我将要编写一个软件,将二进制文件放入radare2,然后将子程序(包括指令、地址和指令的二进制表示)转储到文本文件中 我与IDA Pro和IDAPython一起使用它,但我也想为radare2重新创建它。文本文件最终应如下所示: 0x0804ba0a 55 push ebp 0x0804ba0b 89e5 mov ebp, esp 0x0804ba0d 83ec18 sub esp, 0x18 0x0804

我将要编写一个软件,将二进制文件放入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*'))
环境

  • radare2:radare2 4.2.0-git 23519@linux-x86-64 git.4.1.1-84-g0c46c3e1e提交:0c46c3e1e30bb272a5a05fc367d874af32b41fe4构建:2020-01-08_u09:49:0
  • 系统:Ubuntu 18.04.3 LTS
解决方案

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

使用radare2外壳的示例

user@host:~$r2/bin/ls
[0x00005850]>aaaa
...
[0x00005850]>pdf@@f>输出
[0x00005850]>q
user@host:~$cat out
...
┌ 38:fcn.00014840();
│           ; var int64_t var_38h@rsp+0xFFFFD0
│           0x00014840 53推送rbx
│           0x00014841 31f6异或esi,esi
│           0x00014843 31ff异或edi,edi
│           0x00014845 e846f2feff调用sym.imp.getcwd
│           0x0001484a 4885c0测试rax,rax
│           0x0001484d 4889c3 mov rbx,rax
│       ┌─< 0x00014850 740e je 0x14860
│       │   ; 代码外部参照来自fcn.00014840@0x14868
│      ┌──> 0x00014852 4889d8 mov rax,rbx
│      ╎│   0x00014855 5b pop rbx
│      ╎│   0x00014856 c3 ret
..
│      ╎│   ; 代码外部参照来自fcn.00014840@0x14850
│      ╎└─> 0x00014860 e88beffeff呼叫符号输入错误位置
│      ╎    0x00014865 83380c cmp dword[rax],0xc
│      └──< 0x00014868 75e8 jne 0x14852
└           0x0001486a E861EFFFF呼叫fcn.000146d0
; 从fcn.00013d00@0x13d9d、0x13da8调用外部参照
...
使用Python和r2pipe的示例

导入管道
R2=r2pipe.open('/bin/ls')#用文件打开R2
R2.cmd('aaaa')#分析文件
R2.cmd('pdf@@f>out')#将每个函数的反汇编写入out文件
R2.退出()#退出R2
还考虑退回逆向工程问题!