ゼロ化が発生したことを確認するために実行中のアプリケーションのスタックとヒープをダンプするにはどうすればよいですか?

ゼロ化が発生したことを確認するために実行中のアプリケーションのスタックとヒープをダンプするにはどうすればよいですか?

機密パラメータを使用した後、プログラムがすべてのアクティブメモリ(スタックとヒープ)でそのパラメータを0に設定していることを確認します。私がやりたい簡単なテストは、実行時にアクティブメモリをフラットファイルにダンプすることです(敏感なパラメータを0にした後)。次に、パラメータのフラットファイルをバイナリgrepします。そうでなければ成功し、そうでなければ失敗します。

スタックとヒープダンプを生成するための既存のツールはありますか?分析情報や記号など他のデータはありません。

答え1

あなたが描いたものはしばしばコアダンプ。カーネルにはこれらの組み込み機能をトリガーする機能があり、これは通常プログラムがsegfaultsによって自動的に実行されますsystemd-coredump

デバッガを使用して手動でコアダンプを実行することもできます。gdbLinuxでは、ほぼ標準のデバッガです。

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 は、実際にはメモリ分析やメモリの暗号化秘密などの項目を探しているので良いです。たとえば、優れたエントロピー表示機能を備えており、バイナリのキーやメモリの圧縮データなどの項目を頻繁に見つけることができます。

一方、すべてのコマンドを直接見つける必要があります...これは独自のメカニズムを備えた高度に専門化されたツールです。

関連情報