컴퓨터 구조
- Memory, CPU 구조
Binary
- PE, ELF
Mitigation
디버깅 방법
- 정적 디버깅, 동적 디버깅(IDA, GDB, LLDB, WINDBG)
+ 어셈블리어, 레지스터, 메모리 구조, 메모리 스택 구조, 메모리 힙 구조
메모리:
- 물리: 하드웨어 메모리 -> 프로그램 ㅈㄴ크면(ex: 4기가) -> 메모리 부족 - > 그래서 가상 메모리 등장
- 가상: 프로그램이 실행 됐을 때 생성되는 메모리(샌드박싱 개념); 프로그램 하나당 하나(분리해서 따로) ex) 2개 -> 2개, 3개 -> 3개
샌드박싱: 샌드박스란 외부로부터 들어온 프로그램이 보호된 영역에서 동작해 시스템이 부정하게 조작되는 것을 막는 보안 형태이다

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

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

반환 주소값 중요!!!
#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 |