본문 바로가기

List/Embedded

[armel] 기초

참조 : http://itpeace.tistory.com/7



[+] Calling Convention

함수를 호출 할 때 4개의 인자는 r0~r3 레지스터에 들어간다.

그 이상의 인자는 스택에 들어간다. 


[+] word, half word, byte

word : 4바이트를 나타낸다.

half word : 2바이트를 나타낸다.

byte : 1바이트를 나타낸다.


[+] 범용 레지스터

범용 레지스터는 r0 ~ r15 까지 존재하고, 마지막 r11 ~ r15 레지스터는 다음과 같이 쓰인다.



[+] r14(Link Register - lr) 의 쓰임새

lr 레지스터는 복귀 주소가 들어가게 되고, 이 주소 값은 함수 프롤로그에서 스택에 저장해놓고, 함수 에필로그에서 pop {r11, lr} 과 같은 명령어로 다시 세팅된다. 따라서 bof 취약점이 존재하는 경우 lr 레지스터를 원하는 값으로 조작시킬 수 있다. 


(의문점 - 해당 서브 루틴에 단순한 연산만 있는 경우 함수 프롤로그와 에필로그에 lr 레지스터에 값을 저장하고 불러오는 명령이 없다. 반대로 char buff[100], strcpy(buff, argv[1]) 과 같이 뭔가 스트링 연산을 해주니까 서브루틴의 프롤로그와 에필로그에도 lr 레지스터에 값을 저장하고 불러오는 명령이 생겼다. 이유는 아직 모름)


[+] NOP

0xffff03e8: nop ; ( mov r0, r0 )

(gdb) x/4bx 0xffff03e8

0xffff03e8: 0x00 0x00 0xa0 0xe1


[+] return value

함수가 끝나고 리턴 값은 r0 레지스터에 들어가게 된다. 


[+] ldm 어셈 명령

예를 들어 다음과 같은 ldm 어셈블리 명령이 있다고 하자.

ldm sp, {r0, r1}


위 명령의 동작은 sp+0에 있는 값을 r0 레지스터로 저장하고, sp+4에 있는 값을 r1 레지스터에 저장한다. 

'List > Embedded' 카테고리의 다른 글

[mips] 기초  (0) 2015.09.05
[arm] RTL  (0) 2015.09.04
Embedded 환경 구축  (0) 2015.06.18
firmware-mod-kit(fmk) 설치  (2) 2015.01.23
[mipsel] 기본 bof 취약점 공격  (0) 2015.01.11