2011-05-11 8 views
6

난 당신이 gdb를 사용하여 $의 EBP 오프셋 긍정적 인보고 매개 변수를 찾을 수 있다는 사실을 알고 : 그들은 제 1 및 제 2 될 것이기 때문에 그런gdb로 지역 변수를 읽는 방법은 무엇입니까?

(gdb) x/4wx $ebp 

을, 나는 x/s를 사용하여 3, 4 주소에 보일 것이다 매개 변수. 지역 변수는 어떻습니까? $ ebp의 음수 오프셋에서 값을 어떻게 볼 수 있습니까? 또한 $ eax의 값을 살펴 보시겠습니까? x/s $eax을 사용하여 $ eax 값을 인쇄하려고하면 주소가 바운드되어 있거나 값이 0입니다. 레지스터에 상수 값을 넣었 기 때문에 값이 0이 아닙니다.

나는 info locals을 시도했지만 "No symbol table info available"이라는 메시지가 나타납니다.

답변

6

먼저 기호를 바이너리로 디버깅하여 컴파일해야합니다. 현재 명령에 gcc의 -g 옵션을 사용하면됩니다. 다른 컴파일러를 사용하는 경우 해당 설명서를 참조해야합니다. 이 후 'info locals'와 print 명령이 작동합니다.

로컬 변수를 보려면 'print'명령을 사용해야합니다. 예를 들어 로컬 변수 'i'를 보면 'print i'만큼 쉽습니다.

$ eax와 같은 방식으로 $ eax를 처리 할 수 ​​있어야합니다. x/s를 사용하고있어 문제가 있다고 생각됩니다. x/s는 문자열을 출력하려고 시도하기 때문에 널 문자가 될 때까지 계속됩니다. 이것이 오랜 시간 동안 일어나지 않는다면 문자열의 길이는 한계를 벗어날 것입니다. 'x/d $ eax'를 사용해보십시오. 'print $ eax'도 할 수 있습니다. 또한 '정보 레지스터'를 사용하여 모든 레지스터 데이터를 가져올 수 있습니다.

0

나는 더 보편적 인 의미에서 당신이 어떤 프로세서와 약간의 호출 규칙에 대한 GDB에게

이 단지 작품을 사용하여 $의 EBP 오프셋 긍정적 인보고 매개 변수를 찾을 수없고,이다 수 있다는 것을 알고.

x86에만 관심이 있고 코드가 프레임 포인터 (기본값으로 사용되었지만 더 이상 opt 모드의 GCC 4.6에 대한 기본값은 아닙니다)로 컴파일되었다고 가정하면 지역은 고정 음수 오프셋 %ebp.

디버그 기호 (-g)를 사용하여 코드를 다시 빌드 할 수 있다면 GDB는 값을 인쇄 할 수 있으며 GDB를 찾는 방법에 신경 쓸 필요가 없습니다.

(예 : 코드가 타사에서 제공 되었기 때문에) 불가능할 경우 해체를주의 깊게보고 추측해야합니다. 어떤 값이 %ebp-8에 저장되었다고 추측하면, GDB로 그 값을 조사 할 수 있습니다. 정확히 같은 방법으로 긍정적 인 오프셋을 검사 할 수 있습니다 : (gdb) x/wx $ebp-8.

주의 : 컴파일러는 지역이 원하는 어떤 방법을 배치는 무료입니다, 그래서 당신은

int x, y, z; 

를 선언하는 경우 컴파일러는 %ebp-12에서 %ebp-16에서 x, y%ebp-20에서, 그리고 z를 저장 무료입니다.

관련 문제