학사 나부랭이

Reversing - Register, Stack Frame 본문

Dot-Gabi/Reversing

Reversing - Register, Stack Frame

태양왕 해킹 (14세) 2021. 5. 30. 02:21

Regiser

CPU 내부에서 사용되는 매우 고속인 메모리인며, CPU가 연산을 위해 메모리에 있는 데이터들을 레지스터에 두어요. 연산을 하는 중에도 연산 결과를 레지스터에 저장하기도 해요.

AX (Accumulator) 산술 및 논리 연산 수행, 함수의 반환값 저장
BX (Base) 데이터의 주소를 가리키는 포인터
CX (Counter) 반복 카운터 저장에 사용 - CX에 반복할 횟수를 지정
DX (Data) AX의 보조, IO 명령
SI (Source Index) 데이터 조작 및 복사(스트림 명령) 시 원본 데이터의 주소 저장
DI (Destination Index) 복사 시 목적지의 주소 저장
BP (Stack Base Pointer) 스택 프레임의 시작(베이스) 주소 저장
SP (Stack Pointer) 스택 프레임의 끝 지점(최상단) 주소 저장
IP (Instruction Pointer) 다음에 실행할 명령어 주소 저장
  Accu Base Ctr Data SP SBP Src Des
64bit RAX RBX RCX RDX RSP RBP RSI RDI
32bit EAX EBX ECX EDX ESP EBP ESI EDI
16bit AX BX CX DX SP BP SI DI
8bit AH AL BH BL CH CL DH DL        

 

Stack Frame

Stack Frame은 함수의 호출 과정에서 그 함수를 사용하기 위해 할당되는 스택 형태의 메모리 공간이에요.

프로그램

int add(int a, int b){
    return a + b;
}
int main(){
    int res = add(1 ,2);
    return res;
}

 

여기서 main 함수에서 func1 함수를 호출, func1 함수가 다시 func2 함수를 호출하고 func2가 끝나면 순서대로 func1, main으로 돌아가야 하죠. 그러나 돌아갈 때는 위치가 명시되어있지 않아요. 그러니 함수 호출 직전에 현재 위치를 스택 영역에 push 하고, 함수가 끝나면 pop 해서 다시 돌아올 수 있도록 해야 해요.

#움짤에서 10h처럼 분명 크기인거 같은데 h가 붙어있는게 있는데 이는 16진수로 나타냈다는 것을 의미해요. 그러니까, 30h는 16 * 3 + 0 = 48이죠.

#움짤에서 보듯이 레지스터가 무조건 역할에 따라서만 사용되지는 않아요. var str = 1 처럼, 변수명이 str이라고 무조건 문자열만 저장하라는 법은 없듯이요.

Comments