-
blukat29.github.io/2015/09/avr-memory-and-registers/
blukat29.github.io/2015/09/avr-reversing/
blukat29.github.io/2015/09/debugging-avr/
위 글을 정독하고 문제를 풀어보도록 하자.
AVR 아키텍처에 대한 내용들이 쓰여있다. 이분 리버싱 카테고리를 참고하면, AVR 프로그램에 대해서 디버깅하는데 필요한 정보들을 확인할 수 있다. 본인이 사용한 것은 IDA를 이용해서 어셈블리를 확인하였고, 이에 대해서 디버깅하며 확인하였다.
AVR 어셈블리의 경우에는 아래 주소에서 확인할 수 있다.
ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf
알아야 하는 것들을 요약하자면,
1. Register
각 레지스터는 8비트이다. 주소공간은 16비트이기에 2개의 레지스터를 이용해서 포인터 표현을 한다.
- r27:r26을 붙이면 (r27이 high byte) X라는 16비트 레지스터가 된다.
- r29:r28은 Y인데, ebp처럼 stack frame pointer로 쓰인다.
- r31:r30은 Z라고도 부르는데, 프로그램 메모리를 읽어올 때 쓰인다.
- r1의 값은 항상 0이다.
- 함수의 argument는 순서대로 r25:r24, r23:r22, r21:r20, … 을 통해 전달한다.
- 함수의 return value는 r25:r24에 저장한다.
- SP는 Stack Pointer인데, SPH:SPL로 사용된다. High:Low로 표현함.
2. Code Section
codeflow
- __RESET : entry point
- 위 함수를 따라가다보면 main함수를 찾을 수 있다.
- static compile이 되어 있기에, 각 함수들이 printf, scanf 같은 함수 일 수도 있다.
address expression
- 주소공간은 16비트이기에 2개의 레지스터를 이용해서 포인터 표현을 한다.
Function Call
- argument는 각각 두개의 레지스터를 차지하며 그 순서는 다음과 같다.
- r25:r24, r23:r22, r21:r20, …
- Return Value도 위 순서로 담기게 된다.
- 일반적으로 r25:r24에 담긴다.
- stack에 데이터를 push하여 전달하는 경우도 있다.
'Writeup > Wargame_Writeup' 카테고리의 다른 글
[ Reversing.kr ] CRC1 (2) 2020.07.17 [ Reversing.kr ] Adventure (0) 2020.04.15 [ Reversing.kr ] PEpassword (0) 2020.04.14 [ Reversing.kr ] WindowKernel (0) 2020.04.13 [ Reversing.kr ] Metroapp (0) 2020.04.09 댓글