kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

Cyber Security

[도서]리버싱 입문 - 리버싱 시작하기

까마기 2017. 9. 4. 18:10
728x90
반응형


<리버싱 시작하기>


1. Ollydbg 2.0 -> abexcm1.exe open


주소 '00401000'에서 부터 F8 시작

주소 '0040100E'에서 F7키(스텝 인투)를 눌러 서브루틴 안으로 들어감


save image



2. 서브루틴으로 들어간 후 

save image


주소'00401013'이 보이는데 이 주소는 서브루틴으로 들어갈 때 운영체제에서 스택에 백업해 놓은 복귀주소이다. 복귀주소는 서브루틴으로 들어가지 않으면 주소 '0040100E' 다음에 바로 수행되어야 할 주소이다. 

즉 서브루틴을 호출하는 코드 바로 다음에 오는 명령어를 가리키는 주소를 복귀주소라 한다.


주소 '7723EA13' 에 있는 'PUSH EBP' 명령어는 서브루틴으로 들어와서 두번째로 실행되는 명령어이다.

이 명령어의 역할은 이전 루틴에서 사용하고 있는 스택 베이스(EBP 레지스터 값)를 스택에 백업받는 것이다. 나중에 이전 루틴으로 복귀할 때 이 값을 EBP 레지스터로 복구한다.



주소 '7723EA14' 에 오는 'MOV EBP, ESP' 명령어는 현재 스택주소(7723EA14)의 최상위 주소를 EBP 레지스터에 입력하는 명령어이다. 


*EBP 레지스터는 스택 베이스로 서브루틴에서 사용하고 있는 스택 영역에 있는 값을 참조할 때 기준이 되는 주소다. 

앞으로 이 서브루틴에서 스택을 참조할 때는 EBP 레지스터 기준으로 값을 가져오게 된다.



3. 또 다른 서브루틴을 호출하기 위해 인수 설정하는 부분

save image

주소 '7723EA34 ~ '7723EA4E' -> 값을 가져오기 위해 EBP 레지스터를 기준으로 데이터가 있는 주소를 지정



4. RETN 10

save image

주소 '7723EA57' -> RETN 10은 서브루틴이 종료하면 ESP 레지스터가 가리키는 주소로 이동한다. 

서브루틴이 종료된 시점에 ESP 레지스터는 복귀 주소가 들어가 있는 '0012FF78' 주소가 들어가 있게 된다. 뒤에 있는 16진수 '10'은 복귀주소로 돌아가면서 반환해야 하는 스택 영역의 크기를 의미한다. 10진수로는 16에 해당하며 16바이트를 반환해야 한다는 의미이다. 


save image


주소 '0012FF78' ~ '0012FF88' 까지 반환되며 복귀한 시점에 스택의 최상위를 가리키는 ESP 레지스터에는 그다음 주소인 '0012FF8C'가 들어가 있게 된다.

save image



5. 스택 영역에 어떤 값이 들어가 있는지 확인

save image


주소 '0012FF7C' ~ '0012FF88' 까지는 서브루틴을 호출하면서 PUSH 명령어를 통해 인자로 넣어준 값이 들어가 있다. 이 스택 영역은 앞에서 살펴봤듯이 복귀 주소로 돌아가면서 시스템으로 반환된다.


주소 '0012FF78'에는 복귀주소가 들어가 있다. 서브루틴이 호출되면서 시스템은 자동으로 복귀할 주소를 스택에 넣어 준다.






반응형