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 ...
#1 楼
我知道距您提出此问题已有一年多了,但我认为为了像我这样遇到任何其他问题的其他人的利益,我会提出一个答案。我发现有几种方法可以使radare2正确地分析新定义的函数:寻找要在
定义函数的地址,键入“ V”进入十六进制转储模式
先键入“ d”然后键入“ f”以定义该功能
现在您可以再次按“ V”,您将获得正确渲染的控制流程图br />我发现的另一种方式避免了可视化模式,这对于脚本编写来说是更可取的:函数名称,地址当然是0x8470。
运行命令'af main',其中main是刚刚定义的函数的名称。
Voila!现在将分析您新创建的函数。
我在正在分析的可执行文件中尝试了这两种方法,该可执行文件与您描述的问题相同,并且都提供了相同的结果。
#2 楼
我终于得到了我的老问题的答案!我将尝试收集此答案中的所有内容。说我们正在经历一个剥离的二进制文件,没有可见的符号和radare2与我们一起: :
查找要添加的函数的地址。在这里,我们在0x804876c处找到了
main()
,这要归功于__libc_start_main()
。 要使用
sym.
分析新符号。然后将焦点切换到该符号:
f sym.main @ 0x804876c
最后,您可以照常运行
aaa
或s sym.main
。
评论
出于好奇,在向二进制文件添加符号的失败尝试中使用了哪些方法/技术?可以共享二进制文件吗?分析非PIE binutils或IOLI crackme0x09
时,我无法重现此错误。
我对问题进行了修改。希望这足够了(是的,这是ARM。。。不是我最好的,但是我正在学习!)。