1. Double Free 검증 우회
- old와 p 포인터에 대한 청크 주소를 다르게 주면 된다.
- 2개의 힙 청크 할당 후 각각의 힙에 대한 포인터가 ptr1, ptr2라면,
free(ptr1)
free(ptr2)
free(ptr1)
으로 old와 p 값이 같은지 체크하는 것을 우회해서 double free를 진행한다.
Double Free 후 fd에 각각의 청크 주소가 적혀있다.
ptr1 -> ptr2 -> ptr1
로 되어있고, 다음 청크 할당 시 ptr2가 할당된다.
이때 fd 값을 overwrite_me로 덮으면
ptr1 -> ptr2 -> ptr1 -> overwrite_me
로 바뀔 것이다.
2. 힙 재할당
- 1번째 청크 할당받는다.
- 이때 데이터로 overwrite_me를 줘서 fd를 덮는다.
3. 힙 재할당
- 2번째 청크를 할당받는다.
- fd에 적힌 1번째 청크가 fastbinsY에 적히고, 다음으로 할당될 것이다.
4. 힙 재할당
- 1번째 청크를 할당받는다.
- fastbinsY에 overwrite_me가 적힌다.
5. 힙 재할당
- overwrite_me에서 청크 할당받는다.
- 이때, "malloc(): memory corruption (fast)" 오류 메시지를 출력하고 비정상 종료된다. 조건을 만족해줘야 overwrite_me에서 청크를 할당받을 수 있다.
- fake chunk를 할당받으려는 fastbin 크기에 맞게 구성해준다.
처음에 전역변수 name에 입력받을 때 fake chunk를 생성해준다.
name에 prev_size가 0이고 size가 0x31인 fake chunk를 생성한다.
그리고 fd는 fake chunk가 시작하는 name 전역변수 주소로 덮는다.
0xdeadbeef와 일치하는지 확인 후 쉘을 띄우는 것을 확인할 수 있다.
Unsorted bin attack (0) | 2020.06.11 |
---|---|
Tcache House of Spirit (0) | 2020.06.11 |
Tcache Dup (0) | 2020.06.10 |
Tcache (0) | 2020.06.10 |
Master canary (0) | 2020.06.08 |