본문 바로가기

Security

[systemhacking] Memory corruption

반응형

해제된 메모리에 접근하거나 메모리를 할당하고 해제하지 않아 메모리 릭이 발생하는 경우

#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