Arm function prologue & epilogue
Python
_start:0001042c (*)
00010574 00 48 2d e9 stmdb sp!,{r11 ,lr}
00010578 04 b0 8d e2 add r11 ,sp,#0x4
0001057c 18 d0 4d e2 sub sp,sp,#0x18
00010580 db ff ff eb bl init int init(EVP_PKEY_CTX * ctx)
00010584 18 30 4b e2 sub r3,r11 ,#0x18
00010588 c8 20 a0 e3 mov r2,#0xc8
0001058c 03 10 a0 e1 cpy r1,r3
00010590 00 00 a0 e3 mov r0,#0x0
00010594 89 ff ff eb bl <EXTERNAL>::read ssize_t read(int __fd, void * __
00010598 00 30 a0 e3 mov r3,#0x0
0001059c 03 00 a0 e1 cpy r0,r3
000105a0 04 d0 4b e2 sub sp,r11 ,#0x4
000105a4 00 88 bd e8 ldmia sp!,{r11 ,pc}
이게 메인 함수의 어셈블리어이다. 이제 분석을 시작해보자
Prologue
Python
00010574 00 48 2d e9 stmdb sp!,{r11 ,lr}
00010578 04 b0 8d e2 add r11 ,sp,#0x4
0001057c 18 d0 4d e2 sub sp,sp,#0x18stmdb sp!, {r11, lr} ; sp -= 8, r11과 lr를 push add r11, sp, #4 ; r11 = sp + 4
해석해보자면 다음과 같다 sp는 스택포인터이며 r11가 rbp라고 보면 된다.

epilogue
Python
0001059c 03 00 a0 e1 cpy r0,r3
000105a0 04 d0 4b e2 sub sp,r11 ,#0x4
000105a4 00 88 bd e8 ldmia sp!,{r11 ,pc}cpy r0,r3 ; r0은 반환값을 담는 레지스터니깐 여기에 값을 복사
sub sp,r11 ,#0x4 ; 스택 닫기
ldmia sp!,{r11 ,pc}; 현제 스택에 있는 8바이트를 각각 r11 과 pc 에 넣고 sp -0x8