빈 함수
void f()
{
return;
}
X86
GCC
f():
push rbp
mov rbp, rsp
nop
pop rbp
ret
MVSC
void f(void) PROC ; f
push ebp
mov ebp, esp
pop ebp
ret 0
void f(void) ENDP ; f
- RET : pop rip 명령어와 동일, 스택에 함수 복귀 주소를 저장 후 ret을 만나면 pop rip를 하면서 복귀
ARM
f():
push {r7}
add r7, sp, #0
nop
mov sp, r7
ldr r7, [sp], #4 #Strack Frame
bx lr
BX LR(서브 루틴 복귀) : R14(LR)의 값을 R15(PC)에 옮기고 함수를 끝낸다.
- R14 : 복귀 주소 저장
- R15 : 다음 실행할 명령어 주소를 저장
- BX : Branch(분기) 지정된 Registry의 값으로 이동
- LDR : LDR Reg Mem , memory 4byte를 읽어 Registry에 복사
MIPS
f():
addiu $sp,$sp,-8
sw $fp,4($sp)
move $fp,$sp
nop
move $sp,$fp
lw $fp,4($sp)
addiu $sp,$sp,8
jr $31
nop
- MIPS는 $0 ~ $31 ( $V0,$A0 등) Registry의 이름을 지정한다.
- jr(j) : 분기 명령어
- $31($ra) : return address를 가지고 있음
- jr $31 : $31레지스터가 가지고 있는 값(주소)로 분기
❗ 저작권 및 참고
'Hacking > Reversing' 카테고리의 다른 글
[Reversing] RISC , CISC (feat. Thumb) (0) | 2022.08.04 |
---|---|
[Reversing] 리턴 값 (0) | 2022.08.04 |