fastbin_dup & fastbin_dup_into_stack
포너블을 한다면 무조건 거처야 한다는 shellphish의 how2heap..
평소에 다른 걸 공부하면 전에 공부했던 걸 까먹어서 이것만 보면 바로 기억나게 만드는 용으로 만들 것이다.
그러니 입문보다는 복습이다.
fastbin_dup 코드는 여기서 보면 된다 -> Link 출처 [https://github.com/shellphish]
fastbin_dup_into_stack은 여기서 -> Link 출처 [https://github.com/shellphish]
fastbin_dup gdb로 까서 상세하게 설명이 되어있는 곳 -> Link 출처 [http://banjjak23.tistory.com/]
fastbin_dup : 청크 A 를 연속으로 2번 free 하는 것은 필터링에 걸리기 때문에 이를 우회하기 위해
A를 한 번 free 하고 다른 청크 B를 free하면 다시 A청크를 free 할 수 있게되는 것이다.
fastbin_dup_into_stack : fastbin 청크가 A,B,C 이렇게 4개가 주어진 상황이라고 가정한다. (gdb 로 shellphish 코드를 까본다면
8만 할당을 할텐데 fastbin 은 최소가 32만큼 할당이 돼서 청크 사이즈를 보면 0x21이라고 뜰 것이다.
32 + 1(prev_inuse) = 33 = 0x20 + 0x1 = 0x21) 그리고 fastbin_dup를 이용해서 A B A 순으로 free를 한다.
다음에 malloc를 할 때 순서가 A B A로 될 것이다. A 와 B 를 재할당하면 A만 남게 된다.
이제 A에 *d = (unsigned long long) (((char*)&stack_var) - sizeof(d)) 를 넣어준다.
(청크의 데이터 구조가 prev_size size data 이렇게 되어있으면 이 data 에서 fd bk 가 만들어진다. 그러니까 이 데이터를 fd 로 인식하게 시키는 것이다.
그러면 이 청크의 fd가 내가 넣어준 *d = (unsigned long long) (((char*)&stack_var) - sizeof(d))
로 될 것이다.)
그리고 이제 다시 할당을 하면 A 에 할당이 될 것이다. 근데 이 A 에 데이터를 보면 fd 영역에 *d = (unsigned long long) (((char*)&stack_var) - sizeof(d)) 이 들어있을 것이다. 그래서 다음에 malloc 를 하면 fd가
스택 주소니까 스택 주소에 할당되는 것이다.
끝!
'Documents > how2heap' 카테고리의 다른 글
how2heap house_of_force (0) | 2018.02.20 |
---|---|
how2heap unsorted_bin_attack (0) | 2018.01.17 |
how2heap poison_null_byte (0) | 2018.01.16 |
house_of_einherjar (0) | 2018.01.15 |
first_fit & unsafe unlink (0) | 2018.01.08 |