간단한 것부터 시작!! 분석을 해보자 .
-----------------------------------------------------------------------------------------------------------------
우선 main+8부분까지는 프롤로그 부분이니깐 생략한다.
main+12 : sub 으로 4 byte 만큼만 빠지므로 변수가 전역변수로 4바이트 만큼 할당함을 알수 있다.
main+16 : 이후 r3 레지스터에 0을 넣고
main+20 : 이 값을 r11- 16 지점에 저장시킨다.
test.c 를 만들어 테스트 해보았다. #include<stdio.h> int main(){ int i=0; } gdb ) 를 하게되면 이것역시 r11-16에 0이란 값을 저장시킨다. 어떠한 영역인지는 아직 모르겠다. 보통 변수값 저장은 r11-16 부터 시작되는 듯하다. 하지만 정확한 분석은 아니다. |
다시돌아와서 변수 선언은 안했었지만 r3에 0을 얺고 그 r3 값을 r11 의 주소값에 저장시켰다. 그리고 main+52를 호출한다.
======================== 분기문 시작 =====================================
main+28 : r0에 pc,#40 이 있는 on8430 주소값에 있는 값을 적재 시킨다 (이메모리영역은 texarea 영역인듯)
이값을 x/s $r0 해서 보면 "this is very easy %d " 값이 나온다.
main+32 : r1 값에 , r11, -16 값을 넣는다. 이 값은 아까 선언했던 0 값이다. 즉 r1=0 이 된다.
main+36 : bl printf 이므로 돌아올 주소를 r14에 넣은뒤 printf 를 호출한다. 즉 this is very easy 0 이 뜨게 된다.
main+40 : r3값에 을 적재하고,
main+44 : r3 값에 r3 에 1을 더한값을 넣는다.
main+48 : r11-16 값에 r3를 적재시킨다.
======================== 분기문 도착 지역 =======================================
main+52 : r3에 r11-16 값을 적재 시킨다. (결국 r3= r3+1 이 되어있다.)
main+56 : r3 값을 9와 비교한다.
main+60 : 작거나 같으면 main+28을 호출하여 돌아간다.
main+64 : r3,#0 을 넣고 초기화 한다.
main+68 : r0 에 r3 값을, 0을 넣는다.
main+72.. 에필로그이다.
--------------------------------------------------------------------------------------------------------
즉 분석만 딱봤을때 9보다 작거나 같을 동안 ++ 를 시켜가면서 this is very easy %d 를 호출하고 ++ 된 값을 뿌려주는 것을 알수 있다.
#include<stdio.h>
int main(){
for(int i=0;i<9;i++){printf("this is very easy %d\n",i);}
return 0;
}
그리도 다시 diass main 을 해봤다.
사실 대충 때리고 틀린 부분을 찾으려했는데 완전히 똑같이 나와 놀랐다.
한가지 또 배운점은 void main() 과 int main() 에 관한 차이이다.
int main()은 함수로 선언되기 때문에 리턴형이 필요하므로 그 리턴형의 주소값을 sp,sp 4 만큼 빼줌으로써, 그값을 전달한다.
때문에 기본적으로 4 byte가 할당 되어 있는 것이다.
하지만 return 0; 을 선언해 놓으면 컴파일러는 알아서 리턴할 함수가 없다는 것을 인식하고 이 할당한 버퍼의 크기를 없앤다.
void main() 의 경우는 리턴할 주소가 없기 때문에 애당초 4byte 의 크기 할당은 없다.
'ARM & 펌웨어 분석' 카테고리의 다른 글
펌웨어 분석 1단계, bin 파일 까기. (Firmware analysis method Unpack Bin file ) (0) | 2012.10.31 |
---|---|
[ARM 크로스 컴파일 환경 구축하기 ] (1) | 2012.10.23 |
[ 10/15 ARM 분석 연습 ] ARM 분석연습. (0) | 2012.10.15 |
[ ARM assembly 공부 ] 1. 기본 내용 (0) | 2012.10.03 |
[ ARM Assambly ] 공부 시작! (0) | 2012.09.24 |