ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • heap0 풀이
    System hacking training/Protostar 2018. 12. 21. 10:23
    [heap0.c]


    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdio.h>
    #include <sys/types.h>
    struct data {
    char name[64];
    };
    struct fp {
    int (*fp)();
    };
    void winner()
    {
    printf("level passed\n");
    }
    void nowinner()
    {
    printf("level has not been passed\n");
    }
    int main(int argc, char **argv)
    {
    struct data *d;
    struct fp *f;
    d = malloc(sizeof(struct data));
    f = malloc(sizeof(struct fp));
    f->fp = nowinner;
    printf("data is at %p, fp is at %p\n", d, f);
    strcpy(d->name, argv[1]);
    f->fp();
    }



    간단한 heap overflow문제다.

    먼저 소스코드를 분석해봤다.

    main()

    d = malloc(sizeof(struct data));
    f = malloc(sizeof(struct fp));

    d라는 구조체 변수에 data구조체 크기 만큼 malloc하여 할당해준다.
    data크기는 64byte이므로 해당 chunk 의 크기는 8byte(header) + 64byte(mem) = 72byte일 것이다.

    다음으로 f라는 구조체 변수에 fp구조체 크기 만큼 malloc하여 할당해준다.
    fp의 구조체 크기는 4byte이므로 해당 chunk의 크기는 8byte(header) + 4byte(mem) = 12byte일 것이라고 생각할 수 있지만
    잠깐 생각해보면 x86에서 chunk의 size는 8byte로 증가하기 때문에 16byte일것이라는 것을 추측할 수 있다.

    이후

    f->fp = nowinner;

    이 부분에 의해 구조체 변수 f의 멤버 포인터 변수 fp가 nowinner()의 주소를 갖게 된다.

    취약점은 바로 아래 strcpy()에 의해 발생하는데

    strcpy(d->name, argv[1]);

    이 부분에 의해 fp가 다른 함수의 주소를 갖도록 할 수 있는 heap overflow 취약점이 발생한다.

    buffer overflow는 heap, stack의 구조가 다를뿐 원리 자체는 같기 때문에 따로 heap overflow를 공부하진 않았다.



    gdb를 이용하여 malloc뒤 bp를 걸어 확인해보면 다음과 같이 chunk b와 f를 memory map에서 확인할 수 있다.

    다음으로

    f->fp = nowinner;

    이 부분을 확인하기 확인하기 위해 임의로 bp를 하나 더 걸고 확인해보면



    이런식으로 chunk f의 어느 위치에 값이 들어가는지를 확인할 수 있다.

    여기서 목적은 winner()를 호출하는 것이기 때문에 이 부분을 overflow를 통해 winner()의 주소로 바꿔주기만 하면 된다.



    따라서 name[0] ~ name[63]까지 총 64byte를 채우고, chunk f의 header 8byte를 dummy값으로 채우고, 바로 다음으로 오는 부분에 winner()의 주소를 채우면 된다.



    winner()의 주소는 다음과 같고



    익스를 하면 끗 :)


    반응형

    'System hacking training > Protostar' 카테고리의 다른 글

    heap2 풀이  (0) 2018.12.22
    heap1 풀이  (0) 2018.12.21
    Stack6 풀이  (0) 2018.02.16
    Stack4 풀이  (3) 2018.02.04
    Stack3 풀이  (0) 2018.02.04
Designed by Tistory.