제로화가 발생했는지 확인하기 위해 실행 중인 애플리케이션의 스택과 힙을 덤프하려면 어떻게 해야 합니까?

제로화가 발생했는지 확인하기 위해 실행 중인 애플리케이션의 스택과 힙을 덤프하려면 어떻게 해야 합니까?

민감한 매개변수를 사용한 후 프로그램이 모든 활성 메모리(스택 및 힙)에서 해당 매개변수를 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는 실제로 메모리 분석 및 메모리의 암호화 비밀과 같은 항목을 찾기 때문에 좋습니다. 예를 들어, 뛰어난 엔트로피 표시 기능을 갖추고 있어 바이너리의 키나 메모리의 압축 데이터와 같은 항목을 자주 발견할 수 있습니다.

반면에 모든 명령을 직접 찾아야 합니다... 이것은 자체 메커니즘을 갖춘 고도로 전문화된 도구입니다.

관련 정보