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,#0x18

stmdb 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