我试图确保在使用敏感参数后,程序将它们从所有活动内存(堆栈和堆)中清零。我希望执行的简单测试是在运行时将活动内存转储到平面文件(在它应该将敏感参数归零之后)。然后我只需对参数的平面文件进行二进制 grep 。如果不是,则成功,否则失败。
是否有现有工具可以生成堆栈和堆的转储?没有其他数据,例如分析信息或符号。
答案1
你所描述的通常被称为核心转储。您的内核有能力触发这些内置函数,并且当您的程序出现段错误时,通常会自动(通过systemd-coredump
)完成这些操作。
您还可以使用调试器手动进行核心转储。gdb
几乎是linux下的标准调试器:
shell> gdb --args /path/to/your/executable --sensible-arg1 -s 2 --sensible-arg3 foobar
[…]
(gdb) start
Temporary breakpoint 1, main(argc=6, argv=…)
(gdb) break the_function_at_which_you_want_to_break
(gdb) continue
[…]
(gdb) generate-core-file
Saved corefile core.123456
(gdb) quit
现在您有了一个核心文件,您可以在其中根据自己的喜好进行操作。
老实说,我发现radare2
它是检查进程内存的首选工具(您可以直接在radare2中执行与上面相同的操作)
shell> radare2 -d /path/to/your/executable --sensible-arg1 -s 2 --sensible-arg3 foobar
[0x7f44444]> aaa
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze function calls (aac)
[x] Analyze len bytes of instructions for references (aar)
[x] Finding and parsing C++ vtables (avrr)
[x] Skipping type matching analysis in debugger mode (aaft)
[x] Propagate noreturn information (aanr)
[x] Use -AA or aaaa to perform additional experimental analysis.
[0x7f44444]> db sym.the_function_at_which_you_want_to_break
[0x7f44444]> dc
[0x7f44444]> e search.in=dbg.maps
[0x7f44444]> / the_needle_you're_looking_for
0x7f524662c3ed hit1_0 some_more_dirty_stuff the_needle_you're_looking_for
…
[0x7f44444]> s hit1_0
[0x7f524662c3ed]> pr
some_more_dirty_stuff the_needle_you're_looking_for Things go really downhill from here…
Radare2 很好,因为它实际上是用于内存分析,并在内存中寻找诸如加密秘密之类的东西。例如,它具有出色的熵显示功能,您通常可以通过它发现二进制文件中的密钥或内存中的压缩数据等内容。
另一方面,我必须自己查找所有命令......这是一个高度专业化的工具,拥有自己的机制。