Stack
프로그램 실행 시 사용되는 메모리 영역 중 하나이다.
런타임 시 생성.
Virtual memory(가상 메모리) 영역 중 하나이다.
MMU -> 주소를 관리해주는데 이러한 공간을 가상 메모리라 한다.
Thread 단위로 생성
시작 위치는 Vista 이상 랜덤 Xp는 고정이다.
용도
임시 데이터 백업
지역변수 저장
함수 매개변수 전달
함수 호출 관련 정보
OS에서 필요할 때 사용
Virtual memory(가상 메모리)의 구조
STACK |
HEAP |
DATA |
TEXT/CODE |
스레드 특징
하나의 프로그램 내에서 다수의 실행 흐름
완벽한 독립이 아닌 일정 부분 공유
공유로 인해 콘텍스트 스위칭(문맥 교환)이 줄어듬.
HEAP , DATA, TEXT는 공유로 사용되고 , STACK은 독립적으로 사용된다.
스택은 크게 Full Stack과 Descending Stack으로 나뉜다.
즉, ADD는 아래로 내려가고, SUB는 올라간다.
PUSH
스택의 data를 저장
ESP를 감소시키고 16비트나 32비트 Source operand를 스택에 복사함.
POP
ESP가 가리키는 곳의 저장된 내용을 Destination operand에 저장 후 ESP 값 증가.
EIP값을 변경하는 명령어
프로그램의 흐름을 변경할 수 있는 명령어
JMP
JMP 주소
주소를 EIP에 저장. -> MOV EIP, 주소
바로 주소에 있는 코드가 실행된다.
CALL
함수의 처음 부분에 나온다.
CALL 주소
PUSH Return Address //EIP 백업
주소를 EIP에 저장. -> MOV EIP, 주소
RET
Linux : RET (Windows: RETN) 둘 다 같은 의미
함수의 끝부분에 나온다.
RETN
POP EIP
RETN n
POP EIP
ADD ESP, n
LEAVE
Stack Frame을 릴리즈 하는 데 사용하는 명령어
ESP와 EBP를 프로시저가 호출될 때 할당된 값으로 복구
아래 코드와 동일
MOV ESP, EBP
POP EBP
리눅스 컴파일용 gcc에서 사용
Application Binary Interface
컴파일 코드와 컴파일된 코드, 컴파일된 코드와 OS 간의 인터페이스를 정의
호환성 유지가 목적
char -> 1byte c 같은 아스키코드에서는 1byte
-> 2byte java같은 유니코드에서는 2byte
Alignment 단위
4byte를 단위로 스택에 저장되기 때문에 9 ,10 ,11 ,12 전부 스택에 3개의 공간을 차지한다.
Calling Convention
함수 호출 목적
Object File Format
.c ,. cpp 컴파일 시 나오는. obj를 의미
linker
.dll .lib //winodws
.so //linux
.obj를 .dll .lib와 같이 함수가 저장되어있는 라이브러리에 연결시켜줘서 .exe를 생성하게 해 준다.
Name Decoration
실제 변수의 이름은 알 수 없다.
함수의 이름은 존재한다.
Endianness
Multi Bytes를 저장하는 순서를 정의하고 있음
최대 4byte 단위로 적용함
intel -> Little Endian
계산
1234 + 5678
기본적으로 계산할 때 뒤에서부터 계산하는 식을 사용하는데, 그렇기 때문에 little endian의 속도가 더 빠르다.
문자열은 Big Endian으로 저장된다.
'악성코드 분석' 카테고리의 다른 글
패스워드 알아내기 (0) | 2019.06.04 |
---|---|
quiz를 통해 익숙해지기 (0) | 2019.05.22 |
어셈블리어 로 test.cpp 해석 (0) | 2019.05.21 |
Debugger사용법, 간단한test.exe파일을 통해 분석 (0) | 2019.05.17 |
기초지식 (레지스터와 어셈블리어) (1) | 2019.05.15 |