HanJeouk의 개인공부 블로그

포너블을 한다면 무조건 거처야 한다는 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로 될 것이다. AB 를 재할당하면 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))

로 될 것이다.)

그리고 이제 다시 할당을 하면 에 할당이 될 것이다. 근데 이  데이터를 보면 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