Reversing/Tool

IDA와 Ollydbg 의 esp 표시 차이와 스택 포인터에 대해

live2skull 2016. 5. 5. 22:42

어쩌다가 발견한 거라 남겨 둠.


다음은 http://reversing.kr 에서 출제한 Easy_CrackMe 파일의 어셈블리 코드 중 일부이다.


1. Ollydbg


2. IDA



먼저 올리디버거 에서는 일반적으로 표시하듯이 ESP + n 형태로 메모리 주소를 가리키고 있는데, 

IDA 에서는 ESP + 현재 스택 포인터 + var_? 형태로 표시하고 있다.


언뜻 보기에 왜 저렇게 표시했을까 싶은데, IDA 에서 자동으로 스택의 사용을 조사해서 지역 변수를 찾아내는데 용이하게 만든 것이다.

IDA의 디스어셈블러 화면 시작 부분을 보면 이렇게 var_? 형태로 특정 값이 설정되어 있는데, 이는 함수 시작 시

EBP 의 주소를 기준으로 스택 상에 변수가 위치하는 오프셋 값이다.





String, var_63, var_62, var_60 은 함수의 지역 변수이므로 EBP 보다 더 낮은 메모리 주소에 위치하고 있으므로 음수 값을 가지며,

hDlg은 함수 호출부에서 볼 수 있듯이 인자 값이므로 EBP 보다 더 높은 메모리 주소에 위치하고 있는 것을 알 수 있다.


윈하는 지역 변수를 선택하고 단축키 "x" 를 누르면 해당 지역 변수가 또 다른 어디에서 참조되었는지 볼 수 있다.

지역 변수를 선택하고 "Enter"를 누르면 "Stack of ..." 창이 뜨며, 해당 함수에서 추측된 스택 프레임을 보여준다. 

경계값 체크를 하지 않아 발생하는 스택 버퍼 오버플로우 공격을 구현할 때 return address가 저장된 곳과의 오프셋을 구하는데 유용하게 사용될 수 있다.