UAF, Use After Free
* Integer overflow와 연계해 reference counter를 overflow시켜 0으로 만들어 강제로 ``c free()``시키는 방법으로 사용할 수도 있다.
#1
보통 ``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 |