ETC/Pwn 메모장
Double Free buggggggg
210_
2019. 6. 14. 23:17
unsafe unlinking 과정을 통해서 pointing target을 내가 원하는 주소로 overwrite한다.
#define unlink(P, BK, FD)
{
FD = P->fd;
BK = P->bk;
FD->bk = BK;
BK->fd = FD;
}
이때 p는 현재 chunk를 나타내고 이 과정은 아래와 같이 나타난다.
FD = *P + 8;
BK = *P + 12;
FD + 12 = BK;
BK + 8 = FD;
이때 unlink 과정에서 fd와 bk pointer를 조작할 수 있으므로 fd+12는 bk로 덮을 수 있다.
protostar heap3번 문제를 참조해보면,
fd+12 = bk (이 과정이 끝나면 ((printf@got - 12) + 12 = winner())
((printf@got-12)+12 = winner() -> g fd(printf@got) = winner())
fd는 안변하네 왜? fd+12에값을 바꾸는 거니까 fd는 안 변하지. 그럼 뒤에서 bk+8=fd일때 fd값은 그대로 들어가지.
bk는 상관없고 fd가 중요함. 왜냐 printf@got = winner()를 해주거든.
bk + 8 = fd (이 과정이 끝나면 (winner()+8 = printf@got - 12)
unlinking과정이 끝나고 printf@plt가 호출되면 printf@got가 호출되고 printf@got는 winner()로 변조되어 있으므로 최종적으로는 winner()가 호출됨! 끝~