我正在努力处理剥离的二进制文件,我想用main()命令(ascii-art CFG表示)可视化VVV函数。 br />

#> r2 ./crackme(在crackme上运行radare2)。

[0x00005430]> aaa(开始对二进制文件进行分析)。 s main的地址)。

main(切换到二进制文件的CFG视图)。包括VVV函数)。由于main()函数的第一个参数,我可以看到main()函数的地址。但是,我总是会收到以下错误消息:

      Not in a function. Type 'df' to define it here

--press any key--


如何解决此问题。例如,我首先尝试在二进制文件上添加自己的符号以标记__libc_start_main()函数的开始,但我不幸失败了...任何想法吗?

EDIT

这是我尝试向二进制文件添加标志的尝试:

#> r2 ./ch23.bin 
[0x000083b8]> aaa
[x] Analyze all flags starting with sym. and entry0 (aa)
[ ] 
[aav: using from to 0x8000 0x8e64
Using vmin 0x8000 and vmax 0x10880
aav: using from to 0x8000 0x8e64
Using vmin 0x8000 and vmax 0x10880
[x] Analyze len bytes of instructions for references (aar)
[x] Analyze function calls (aac)
[ ] [*] Use -AA or aaaa to perform additional experimental analysis.
[x] Constructing a function name for fcn.* and sym.func.* functions (aan))
[0x000083b8]> pdf
            ;-- section_end..plt:
            ;-- section..text:
/ (fcn) entry0 44
|   entry0 ();
|           ; UNKNOWN XREF from 0x00008018 (unk)
|           ; UNKNOWN XREF from 0x00008c18 (unk)
|           0x000083b8      00b0a0e3       mov fp, 0                   ; [14] va=0x000083b8 pa=0x000003b8 sz=800 vsz=800 rwx=--r-x .text
|           0x000083bc      00e0a0e3       mov lr, 0
|           0x000083c0      04109de4       pop {r1}
|           0x000083c4      0d20a0e1       mov r2, sp
|           0x000083c8      04202de5       str r2, [sp, -4]!
|           0x000083cc      04002de5       str r0, [sp, -4]!
|           0x000083d0      10c09fe5       ldr ip, [0x000083e8]        ; [0x83e8:4]=0x8664
|           0x000083d4      04c02de5       str ip, [sp, -4]!
|           0x000083d8      0c009fe5       ldr r0, [0x000083ec]        ; [0x83ec:4]=0x8470
|           0x000083dc      0c309fe5       ldr r3, [0x000083f0]        ; [0x83f0:4]=0x8668
\           0x000083e0      e5ffffeb       bl sym.imp.__libc_start_main; int __libc_start_main(func main, int argc, char **ubp_av, func init, func fini, func rtld_fini, void *stack_end);
[0x000083b8]> f main @ 0x8470
[0x000083b8]> s main
[0x00008470]> VVV
... miserable fail ...


评论

出于好奇,在向二进制文件添加符号的失败尝试中使用了哪些方法/技术?

可以共享二进制文件吗?分析非PIE binutils或IOLI crackme0x09
时,我无法重现此错误。
我对问题进行了修改。希望这足够了(是的,这是ARM。。。不是我最好的,但是我正在学习!)。

#1 楼

我知道距您提出此问题已有一年多了,但我认为为了像我这样遇到任何其他问题的其他人的利益,我会提出一个答案。我发现有几种方法可以使radare2正确地分析新定义的函数:


寻找要在
定义函数的地址,键入“ V”进入十六进制转储模式
先键入“ d”然后键入“ f”以定义该功能
现在您可以再次按“ V”,您将获得正确渲染的控制流程图br />我发现的另一种方式避免了可视化模式,这对于脚本编写来说是更可取的:函数名称,地址当然是0x8470。
运行命令'af main',其中main是刚刚定义的函数的名称。
Voila!现在将分析您新创建的函数。

我在正在分析的可执行文件中尝试了这两种方法,该可执行文件与您描述的问题相同,并且都提供了相同的结果。

#2 楼

我终于得到了我的老问题的答案!我将尝试收集此答案中的所有内容。
说我们正在经历一个剥离的二进制文件,没有可见的符号和radare2与我们一起: :


查找要添加的函数的地址。在这里,我们在0x804876c处找到了main(),这要归功于__libc_start_main()

要使用sym.分析新符号。


然后将焦点切换到该符号:f sym.main @ 0x804876c


最后,您可以照常运行aaas sym.main