스택 버퍼 오버플로우: 입력받는 크기를 정하지 않음 => 정해준 메모리를 넘어가면 다른 메모리에 영향을 끼칠 수 있음
입력할 떄 지역변수와 spf를 넘어가는 메모리를 입력한 뒤 반환주소값으로 돌아가지 못 하게 악성 셸 코드를 입력할 수 있음???
#include <stdio.h>
int main() {
char buf[64] = {0, };
scanf("%s", &buf);
}
스택 영역 (매개변수 생략):
| 지역변수 |
| sfp |
| 반환 주소값 |
반환 주소값 데모
#include <stdio.h>
void b() {
printf("B");
return 0;
}
void a() {
printf("A");
b();
return 0;
}
int main() {
int32_t buf[18] = {0, };
a();
return 0;
}
main -> a -> b -> a -> main
프로그램이 실행이 되어야 하기 때문에 함수가 호출이 되어도 다시 돌아올 주소(함수가 끝난 부분)가 필요함
32, 64 비트 환경에서의 차이점 (나누기 8)
32 비트: 4바이트씩 처리
64 비트: 8바이트씩 처리
그러므로 각 환경에서의 데이터형이 조금씩 다름
포맷 스트링 버그: 서식 지정자를 정해주지 않음 => 다른 메모리를 읽어올 수 있음
#include <stdio.h>
int main() {
char buf[24] = {0, };
scanf("%22s", &buf);
printf(buf) //printf("%22s", &buf)
}
#include <stdio.h>
int main() {
char buf[32] = "ABCDE";
char buf2[42] = "SECRET"; //절대 바뀌면 안 되는 비밀키라고 가정
int idx = 0;
//"지역변수"의 크기: 78byte
scanf("%d", &idx);
buf[idx] = "A";
}
idx 값이 0이라면 => ABCDE
idx에 32를 넣으면 => AECRET
RET의 0번째 인덱스에 침범하려면 => 85 바이트 입력
| 32 buf | 0 ~ 31 | |
| 42 buf | buf[32] = buf2[0] ~ 41 | |
| 4 idx | buf2[42] = idx[0] ~ 3 | |
| 8 sfp | idx[4] / sfp[0] ~ 7 | |
| 8 ret | sfp[8] = ret[0] ~ 7 |
'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 |
| 컴퓨터 구조: 메모리 - week01 (0) | 2023.09.11 |