ubuntu 16.04 LTS glibc 2.23 기준
unsortedbin
에서의 main_arena
동작을 살펴 본다.
xxxxxxxxxx
void main()
{
char* a = malloc(0x80);
char* b = malloc(0x10);
char* c = malloc(0x80);
char* d = malloc(0x10);
char* e = malloc(0x80);
char* f = malloc(0x10);
free(a);
free(c);
free(e);
}
테스트 코드는 위 코드를 사용하였다.
( gcc -o test test.c -m64 )
free
세 개에 각각 breakpoint를 걸고 main_arena
를 살펴보겠다.
free(a)
free(a)
를 실행하기 전 main_arena+88
이다. top chunk
의 주소가 들어가 있다.
free(a)
를 실행한 후 main_arena+88
이다.
0x602000
의 fd
와 bk
에는 main_arena+88
의 주소가 들어가 있으며
main_arena+88
+ 0x10 = 0x602000
main_arena+88
+ 0x18 = 0x602000
으로 main_arena
가 셋팅되었다.
free(b)
main_arena+88
+ 0x10과 main_arena+88
+ 0x18에 동일한 값이 들어 있으며 해당 값의 0x18을 더한게(bk) main+arena+88
의 주소라면 unsortedbin chain
을 구성한다.
bck = unsorted_chunks (av);
fwd = bck->fd;
if (__glibc_unlikely (fwd->bk != bck))
{
errstr = "malloc(): corrupted unsorted chunks";
goto errout;
}
glibc 2.26 malloc.c #3930 ~ #3936
위 코드에 의해 무결성 검증이 진행된다. (glibc 2.23과 동작 같음)
(unsorted_chunks (av)
매크로는 unsortedbin
의 top chunk
의 주소를 가져오는 매크로이다.)
무결성이 검증되면 위와 같이 체인이 구성된다.
free(c)
위와 같이 처음과 끝, 두 개의 주소로 unsortedbin
을 구성한다.
추가적으로, unsortedbin
을 malloc
할 시
/* remove from unsorted list */
unsorted_chunks (av)->bk = bck;
bck->fd = unsorted_chunks (av);
glibc 2.26 malloc.c #3766 ~ #3768
위 코드가 실행되는데, 이 코드를 이용하여 unsortedbin attack
을 진행할 수 있다.
bck
는 victim->bk
를 가지고 있다.
여기서 만약 bck
의 값을 바꿀 수 있다면 (arbitray value)->fd
에 unsorted_chunks (av)
의 값을 쓸 수 있다는 것이 된다.
'system > material' 카테고리의 다른 글
docker 간단한 사용법 정리 (0) | 2019.08.25 |
---|---|
19회 해킹캠프 발표자료 (tcache 동작 분석 및 exploit) (0) | 2019.02.19 |
2019 codegate preliminary 풀이 보고서 (0) | 2019.02.01 |
dynamic, static, pie.. (0) | 2019.01.24 |
c++ std::string (0) | 2019.01.22 |