* Integer overflow와 연계해 reference counter를 overflow시켜 0으로 만들어 강제로 ``c free()``시키는 방법으로 사용할 수도 있다.


#1

``c free()``된 영역을 참조하는 경우.

보통 ``c free()``하면 `` fd/bk/last_size`` 부분만 초기화되고 나머지 영역은 그대로 남아있기 때문에 나머지 영역에 있는 데이터를 leak할 수 있다.

이 때 ``c puts()``같은 문자열 함수를 사용해 처음부터 출력하면 `` \x00``까지만 읽어 `` fd`` 첫 바이트가 `` \x00``인 경우 아무것도 출력되지 않으므로 주의.

```c

int main(){

    void *old_p = malloc(32);

    void *new_p;

    strcpy(old_p, "aaaabbbbccccddddeeeeffffgggg");

    free(old_p);

    

    new_p = malloc(32);

    puts(&new_p[8]);

    

    return 0;

}

```

```

ccccddddeeeeffffgggg

```


#2

function pointer를 사용하는 경우(e.g., `` old->funcptr``) function pointer 부분이 다른 값으로 변경되면 코드를 실행하는 취약점으로 연결될 수도 있다.


``c free(old)`` 이후 ``c new = malloc()``으로 같은 chunk 또는 `` old``가 있던 영역의 chunk를 반환 받았을 때, chunk에 `` old``를 이용해 접근하는 경우도 포함한다.


```c

#include <stdio.h>

#include <stdlib.h>


void some_func(){ }


typedef struct _vul_st{

    int i;

    void (*fp)();

}vul_st;


int main(){

    vul_st *st = malloc(32);

    char *new_p;

    

    st->i = 0x1234;

    st->fp = some_func;

    free(st);

    

    new_p = malloc(32);


    memcpy(new_p, "\x01\x01\x01\x01\x01\x01\x01\x01 \

    \x41\x42\x43\x44\x00\x00\x00\x00", 16);

    printf("%p is st->fp\n", st->fp);

    st->fp();

    

    return 0;

}

```

```bash

$ strace -if ./uaf

....

[00007f67a7f3a710] write(1, "0x4342412020202020 is st->fp\n", 290x4342412020202020 is st->fp

) = 29

[00000000004006b6] --- SIGSEGV {si_signo=SIGSEGV, si_code=SI_KERNEL, si_addr=0} ---

[????????????????] +++ killed by SIGSEGV +++

Segmentation fault

```



'Security > System Exploit' 카테고리의 다른 글

pwntools  (0) 2017.08.13
Shellcode  (0) 2017.07.26
[glibc] free_hook, malloc_hook  (0) 2017.07.23
[glibc] malloc - checks  (0) 2017.07.22
[glibc] malloc - 4  (0) 2017.07.21