컴퓨터 구조
- Memory, CPU 구조
Binary
- PE, ELF
Mitigation
디버깅 방법
- 정적 디버깅, 동적 디버깅(IDA, GDB, LLDB, WINDBG)

 

+ 어셈블리어, 레지스터, 메모리 구조, 메모리 스택 구조, 메모리 힙 구조

 

 


메모리:
- 물리: 하드웨어 메모리 -> 프로그램 ㅈㄴ크면(ex: 4기가) -> 메모리 부족 - > 그래서 가상 메모리 등장
- 가상: 프로그램이 실행 됐을 때 생성되는 메모리(샌드박싱 개념); 프로그램 하나당 하나(분리해서 따로) ex) 2개 -> 2개, 3개 -> 3개

 

샌드박싱: 샌드박스란 외부로부터 들어온 프로그램이 보호된 영역에서 동작해 시스템이 부정하게 조작되는 것을 막는 보안 형태이다


mmu: 
가상-물리 연결: 

 

프로그램 2개를 하나의 메모리에 넣었을 때의 문제(샌드박스): 
- 간섭: 하나 죽으면 영향이 감
- 가상 메모리의 주소가 같을 수 있음 but 문제 없음 => 서로 공간을 나누기 때문

global 전역 변수!!!!!!

http://www.tcpschool.com/lectures/img_c_memory_structure.png


낮은/높은 주소 주의 -> 주소 거꾸로 나올 수 있음! 주의

코드 컴파일하면 
리눅스는 elf
윈도우는 exe

 

메모리
낮은 메모리 (low memory) 코드 영역 (실행할 프로그램의 코드) 실행할 프로그램의 코드 - 주로? 2진수로 메모리에 박힘
  데이터 영역 (전역 변수 / 정적 변수) 전역 변수 선언 후 scanf로 입력 받으면 여기로
  힙 영역 (사용자의 동적 할당) 동적 할당 - 상황에 따라 공간의 크기를 변경, 낮은 주소에서 높은 주소로 이동 ex) malloc
런 타임에 크기가 결정됨
높은 주소 (high memory) 스택 영역 (지역 변수 / 매개 변수)  모든 프로그램의 근간
높은 주소에서 낮은 주소로 올라감
동적 할당과 스택 둘 다 크기 늘어나면 힙-스택 영역에서 스택 오버플로우
컴파일 타임에 크기가 결정됨


스택 오버플로우 이유: 지역 변수가 스택에 저장


스택이 높->낮 주소로 이동하는 이유:    

 

http://www.tcpschool.com/lectures/img_c_stackframe_01.png



반환 주소값 중요!!!

 

#include <stdio.h>

int function1() {
	return 0;
}

int function2() {
	return 0;
}

int main() {
    function1();
    function2();
    
    int *ptr1 = malloc(32);
    int *ptr2 = malloc(32);
}


- main을 호출하기 전에 있는 함수
- 모든 함수들은 작동 후 돌아감/메모리에서 사라짐
- main함수에서 A함수 호출 -> A함수가 동작이 끝나면 main으로 돌아옴(return을 하기 때문)
- A가 끝나면 main으로 돌아감 => 돌아가는 곳이 반환 주소값
- main위에 A메모리가 생김
- A가 B를 호출하면 A위에 B메모리
- 함수는 동작 후 메모리도 없어짐
- 스택 오버플로우는 함수 안에 함수 호출을 계속 하기 때문에 웬만한 프로그램에서는 안일어남
- 스택은 효율적으로 메모리를 관리하는 시스템


메모리의 동적 할당: 무조건 malloc 함수 배우고 
http://www.tcpschool.com/c/c_memory_malloc 
동적 할당은 프로그램에서 매우매우매우 많이 씀
이유: 런타임!
- 함수 안에서 변수 선언 -> 남는 메모리(바이트) -> 인풋(scanf)로 받음 -> 공간 남음 -> 그래서 동적 할당을 받음
- 사용자에게 사이즈 물어봄 int *ptr1 = malloc(8); int *ptr2 = malloc(8); -> 2개의 동적 할당 -> 1 바로 밑에 2 생김 
포인터: 메모리를 가지고 있는 변수


+

#include <stdio.h>

int main() {
    int *ptr1 = malloc(32);
    int *ptr2 = malloc(32);

    free(ptr1); //1공간 자체를 날려버림 날림

    int *ptr3 = malloc(32); // -> int *ptr3 = malloc(42); // -> int *ptr3 = malloc(8);
}
3 // 밑의 1의 빈(없어진) 공간에 들어감 // 3 malloc(8)
1 // 사라짐
2 //
3 // malloc(42) 사이즈가 다르기 때문

 


int *ptr1 = malloc(32);
int *ptr2 = malloc(64);
int *ptr2 = malloc(128);

free(ptr2);
free(ptr1); 

int *ptr4 = malloc(50);

 

1 //사라짐
2 //사라짐 - 합쳐짐 96 바이트 - 밑 50바이트에 4
3

 

'KUality(해킹 동아리)' 카테고리의 다른 글

HSpace 특강 - <해킹 Insight> CTF 편  (0) 2023.11.11
Kuality 11.7: V8 Exploitation & POC Recap  (0) 2023.11.07
KUality 일정 및 계획- week04  (0) 2023.10.16
Fuzzing - week03  (0) 2023.09.25
Memory Corruption - week02  (0) 2023.09.18