gdb를 사용하여 환경 변수 확인

gdb를 사용하여 환경 변수 확인

Ubuntu 12.04 시스템의 프로그램에서 SHELL 환경 변수의 주소를 찾으려고 노력해 왔습니다. ASLR을 껐습니다.

비슷한 게시물을 찾았습니다.그래서 질문은그리고블로그 게시물

gdb에서 다음을 사용해 보았습니다.

 (gdb) x/s *((char **)environ)

하지만 다음과 같은 메시지를 받았습니다.

 (gdb) No symbol "environ" in current context

우분투 12.04에서는 작동하지 않나요? gdb를 사용하여 프로세스에서 환경 변수의 주소를 확인하는 다른 방법이 있습니까?

답변1

strip바이너리 기호가 ped되었습니까? 그렇다면 기호 테이블도 없고 기호를 찾을 가능성도 없습니다. readelfhello바이너리는 여기를 통해 찾을 수 있습니다 .하다기호 테이블이 있습니다:

$ readelf -S hello | grep -i symtab
  [28] .symtab           SYMTAB           0000000000000000  000018f8
$ 

또한 GDB를 실행할 때 프로그램이 실제로 시작됩니까? 기호 테이블이 로드될 때까지 이 기호를 확인할 수 없는 것 같습니다. GDB를 처음 시작할 때는 로드되지 않지만, 클릭하면 로드되어야 합니다 main(). main()프로그램에 중단점을 배치 run하고 main()중단점에 도달하면 변수를 검사할 수 있습니다.

Reading symbols from hello...(no debugging symbols found)...done.
(gdb) x/s *((char **)environ)
No symbol table is loaded.  Use the "file" command.
(gdb) b main
Breakpoint 1 at 0x4005c8
(gdb) r
Starting program: /home/ubuntu/hello 

Breakpoint 1, 0x00000000004005c8 in main ()
(gdb) x/s *((char **)environ)
0x7fffffffe38f: "XDG_VTNR=7"
(gdb) 

답변2

에서 gdb명령을 사용할 수 있습니다 show environment. 프로세스 환경을 점검하는 대안은 다음과 같습니다.

$ sed 's/\x0/\n/g' /proc/<PID>/environ

sed명령은 가독성을 높이기 위해 NUL 구분 기호를 줄 바꿈으로 변환하는 데 필요합니다.

두 접근 방식의 장점(간단함 외에도)은 기호 테이블이 삭제되어도 문제가 되지 않는다는 것입니다. :-)

관련 정보