나는레디스데이터베이스를 사용하고 있으며 애플리케이션에서 사용 중인 RAM의 내용을 탐색하려고 합니다.
제가 질문하는 것보다 제가 왜 이 일을 하는지 설명하는 것이 더 의미가 있다고 생각합니다.
Redis는 바이너리 데이터를 저장하는 간단한 키-값 저장소입니다. 저는 이곳이 코딩과 같은 것들을 탐구하기에 좋은 장소라고 생각했고, 바이너리 데이터 세트를 찾기 위해 RAM을 탐색하는 것과 같은 일을 하는 것이 재미있을 것이라고 생각했습니다. 간단한 패턴을 찾는 것과 같은 일을 하는 것도 재미있을 것입니다. RAM에서 검색하기 위한 베이비 쿼리 언어입니다.
이 장을 읽고 나서 이런 생각이 들었습니다.SICP쿼리 언어에 대해.
어디서부터 시작해야 할지 아이디어가 있나요? 처음에 저는 시스템에 "이 응용 프로그램을 실행할 주소 공간을 알려주세요"라고 묻고 싶었습니다.
답변1
cat /proc/[pid]/maps
proc 매뉴얼 페이지에 따르면.
당신이 원하는 것 같습니다. pid가 필요하면 ps나 다른 도구에서 가져오십시오.
이는 사용 중인 주소 공간을 찾는 문제를 해결합니다. 작년에 defcon의 연구원은 Linux에서 createremotethread를 구현했습니다. 따라서 이렇게 할 수 있습니다... 그런 다음 이런 방식으로 임의의 메모리를 읽을 수 있습니다.
~에 귀속됨푸수시pmap -x [pid]
이것이 읽기 더 쉽다 는 점을 지적하십시오 .
답변2
gdb를 사용하여 프로세스의 메모리에 액세스할 수 있습니다.
또한 "/proc" 파일 시스템을 살펴봐야 합니다. 여기에는 각 프로세스에 대한 의사 파일이 포함되어 있으며 그 중 일부에는 흥미로운 정보가 포함될 수 있습니다.
답변3
디버거를 사용하세요. 그게 바로 디버거의 목적입니다.
직접 시작하고 싶다면 모든 것이 사라질 것입니다ptrace
.
프로세스의 메모리 맵(메모리 내용 테이블)을 보고 /proc/$pid/maps
여기에서 전체 메모리 내용을 읽을 수 있습니다 /proc/$pid/mem
. 후자의 파일은 정상적으로 열 수 없습니다.Linux에서 /proc/$pid/mem을 읽는 방법은 무엇입니까?