gdb에 backtrace
과 비슷한 스택 추적 프로그램을 작성 중입니다.주 시작 주소를 결정하는 방법
Example Program
void bar(int x, int y){
trace(stdio);
}
void foo(){
bar(1, 2);
}
int main(int argc, char*argv[]){
foo();
}
이
Function bar..
Function foo..
문제는 내가 어떻게 주에 도달하면 중지하는 아무 생각입니다을 인쇄합니다. 함수의 시작 주소를 저장하는 테이블이 있는데 main
을 포함합니다.
내 접근 방식은 trace
함수입니다. 먼저 작은 어셈블리 코드를 작성하여 ebp
을 읽습니다. 그리고 trace
에 대한 return addr
은 bar
입니다. 나는 주에 도달하면
그래서 나는
을 (이 상대적 IP를 사용합니다) trace
의 반환 주소 (bar
에 CALL
명령에 의해 결정)을 offset
을 추가하여 trace
의 시작 주소를 얻을 수 있지만, 나는 같은 기술을 사용할 수 없다. main
의 복귀 주소는 내가 접근 할 수없는 메모리 영역으로 데려다 준다.
이미 main
함수에서 Im을 어떻게 확인할 수 있습니까? ,
'main()'의 시작 부분 아래 또는 다음 부분의 주소를 넘어서는 부분은 무엇입니까? – Notlikethat
'main'에서'push % ebp'의 시작 주소를 얻고 싶습니다. 무슨 뜻입니까? –
아, 나는 "나는 테이블을 가지고있다."라고 읽는다. 미리 주소를 가지고 있다는 것을 의미한다. 스택을 걸을 때 그 주소를 수집하는 것이 아니라 내 실수이다. – Notlikethat