AVR Reversing
25 Sep 2015AVR instruction set은 공식 문서에 잘 나와 있으므로 아래를 참고하면 된다. 각각의 인스트럭션은 이 글에서 설명하지 않겠다.
http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_instruction_list.html
http://www.atmel.com/Images/doc1022.pdf
이 글은 C언어로 작성된 AVR프로그램에 등장하는 패턴을 적어놓은 것이다.
1. 프로그램 구조
프로그램은 __RESET
이라는 지점에서 시작한다. 보통 프로그램의 제일 처음 (0x0000)에 보면 jmp __RESET
인스트럭션이 있다. __RESET
에서는 SP값을 세팅하고 SRAM에 .data섹션의 내용을 load한 뒤 main을 호출한다.
main부터는 일반적인 C함수와 마찬가지로 callee-save인 레지스터를 push하고, SP를 내리고 지역변수를 레지스터와 스택에 저장한다.
AVR 하드웨어에는 프로그램을 하나만 올리기 때문에 모든 라이브러리 함수가 static하게 compile되어있다. 따라서 AVR 프로그램을 리버싱 할 땐 printf나 strcmp따위의 라이브러리 함수를 찾아내는 것이 중요하다.