반응형
해제된 메모리에 접근하거나 메모리를 할당하고 해제하지 않아 메모리 릭이 발생하는 경우
#include <stdio.h>
#include <malloc.h>
int main(void) {
char* a = (char *)malloc(100);
char *b = (char *)malloc(100);
memset(a, 0, 100);
strcpy(a, "Hello World!");
memset(b, 0, 100);
strcpy(b, "Hello Pwnable!");
printf("%s\n", a);
printf("%s\n", b);
free(a);
free(b);
free(a);
}
: a 두번 해제
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main(void) {
char *a = (char *)malloc(100);
memset(a, 0, 100);
strcpy(a, "Hello World!");
printf("%s\n", a);
free(a);
char *b = (char *)malloc(100);
strcpy(b, "Hello Pwnable!");
printf("%s\n", b);
strcpy(a, "Hello World!");
printf("%s\n", b);
}
a를 free시키면 메모리 영역은 해제되지만 a는 그대로 그 주소를 가르킴
여기에 b를 통해 새로 메모리 할당 받으면 a와 b가 같은 주소를 가르킴.
새로운 메모리 영역을 할당할 때 메모리를 효율적으로 관리하기 위해 기존에 해제되었던 메모리가 그대로 반환되어 일어나는 일이다.
a에 접근하면 b가 같이 영향을 받으므로 의도하지 않은 일이 발생함.
# gcc -o uaf1 uaf1.c
# ./mem
Hello World!
Hello Pwnable!
Hello World!
#
초기화되지 않은 메모리
typedef struct person {
char *name;
int age;
} Person;
int main(void) {
Person p;
unsigned int name_len;
printf("Name length: ");
scanf("%d", &name_len);
if(name_len < 100)
p.name = (char *)malloc(name_len);
read(0, p.name, name_len);
printf("Age: ");
scanf("%d", &p.age);
printf("Name: %s\n", p.name);
printf("Age: %d\n", p.age);
}
malloc()은 메모리 할당만 진행, memset 으로 초기화하지 않으면 쓰레기 값이 채워짐.
calloc()은 할당과 동시에 NULL로 초기화
위 코드에서는 메모리 초기화를 하지 않음.
name을 출력하는 부분에서 초기화되지 않은 다른 메모리가 출력될 수 있음.
name_len이 100보다 큰 경우 이에 대한 예외처리도 없음.
메모리를 할당하지 않고 쓰면 쓰레기 값이 들어감.
이 값을 조작할 수 있으면 원하는 메모리 주소에 원하는 값을 쓸 수 있음.
반응형
'Security' 카테고리의 다른 글
[systemhacking] Buffer overflow c++ (0) | 2021.11.22 |
---|---|
[systemhacking] Integer Issues (0) | 2021.11.22 |
[systemhacking] format string bug (0) | 2021.11.17 |
[systemhacking] Off-by-one (0) | 2021.11.11 |
[systemhacking] Out of Boundary (0) | 2021.11.11 |