참조 : 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 |