임베디드/임베디드 레시피

Stack corruption

twoweeks-within 2025. 1. 19. 18:05

 

 

prefetch_handler :: prefetch Abort 가 난상황!

 

 

 

 

 

R14 : 0x2   >> ?? 모름

>

R13 확인 ( SP) 인데 이전 mode 의 R13을 확인해야함 

   > Abort mode의 stack 을 가르키고있음 (  현재 error는 prefetch Abort인데)

 

이전 mode의 상태는 SPSR에 저장되어있음

   :  40000033 == 0011 0000 0000 0000 0000 0000 0011 0011 

   > 10011 (하위 0~4bit ) : SVC mode

    >  1 (하위 5 bit ) : Thumb 모드

  

>

SVC 의 R13 확인 : 0x0116FD24

 

 

 

FFFFFFFF 만있다.. 

+

SVC R14도 FFFFFFFF....

>>>

이럴때는  stack 을 뒤져봐야함

 

FDStack 이므로 쌓은 순으로 보면 가장 최근에 남겨놓은 정보는  

   : 0x00EDD0FD -1

 

 

 

 

chaos() 함수에 진입 > 돌아올 주소 R14를 남겨놓았던 흔적

 > chaos 진입하는 과정에서 문제생긴걸로 보임

   > chaos 를 들여다 보자

 

 

chaos()

{

  word LocalBuffer[10];

  memset ((void *)(LocalBuffer - 10) , 0xFF, 40);

  return;

}

 

> Local 변수를 하나 만들고 0번 인덱스에서 -10 번 인덴스부터 0xFF 를 40byte 만큼 채움

 

code 의 Assembly는?

(상) chaos 함수의 asembly (하) R14 SVC R13 stack

 

 

chaos 함수 진입 > 돌아갈 주소(LR) 에 R14를 넣음

 

sub sp, #0x14 : 20바이트 arry를 위해 자리를 만들어둠 ( 0x14 == 20 )

//  thumb mode :  원래 word (4byte) 에서 나누기 2

 

다한뒤  : add sp,#0x14

>

PC(R14) 로 복귀

 

blx 0xF02348 : 

  > LR에 0xEDCE65 를 ( 0xEDCE64 +1 ) 을 넣고 branch

 

 

(a) chaos() 처리후 돌아갈 LR  : 0x00EDD0FD

 

memset 진입 > SP : LocalBuffer 를 stack에 마련 > (C)를 가르킴

     

>

(e) 에 memset을 한뒤 돌아갈 주소 :0xEDCE64를 넣은뒤 branch

 

 

(b) : 0x14 (20byte) (LocalBuffer) 를 위해 stack 이 자리잡음

        > 0x116FD34 : LocalBuffer[9]

// 스택이 높은주소에서 낮은주소로 내려감

//  > 높은 인덱스에서 낮은 인덱스로 값을 저장함  > 이건 규칙임

// >>> 배열인덱스가 증가할수록 주소가 증가하는 원리임!

(c) : LocalBuffer[0]

(d) : LocalBuffer[0-10]

// Thumb 모드라서 16bit (2byte) 씩차지함 > 주소가 -2씩 줄어들음 

// 0~9 까지는 : 2*10 = 20

// 0~ (-9) : 2*10 =20 

 

 

 

그 뒤 채우고자하는 0xFF 값을 채움

 

pop PC : chaos() 함수로 돌아오고자함

 

>

(e) 에 있는 0xFFFFFFFF 를 PC로 집어넣고 SP 를 하나 늘렸더니..

      // SP는 (c)를 가르키고 있게됨

  > 0xFFFFFFFF로 branch 를 못하고 prefetch Abort 발생 ! 

 

 

>> Array를 잡아놓고서 더큰 크기를 쓰게되면 문제가 발생함!

 

 

 

 

 

void Test()

{

  int LocalBuffer[3];

  

  LocalBuffer[0] =0;

  LocalBuffer[1] =1;

  LocalBuffer[2] =2;

  LocalBuffer[3] =3;

 

 return;

}

 

 

 

R14 > LocalBuffer[3] 의 값을 넣음

 

> return 할때 R14 에있던값이 Local Buffer[3] 으로 바뀌어있어서 예상치 못한 동작을함

  >> Array Over Run !

 

 

'임베디드 > 임베디드 레시피' 카테고리의 다른 글

0x0 go  (0) 2025.01.19
Abort is ISR - IRQ mode 에서의 Abort  (0) 2025.01.19
Data Abort  (0) 2025.01.18
Task Lock > Watch Reset, 메모리덤프 보는법 ( stm32 cubeide)  (0) 2025.01.18
Interrupt Lock > Watch dog Reset  (0) 2025.01.17