-
Double Free bugggggggETC/Pwn 메모장 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()가 호출됨! 끝~
'ETC > Pwn 메모장' 카테고리의 다른 글
반복문에서 쉘코드 크기 줄이기 (0) 2019.06.24 shellcode 작성 시 null byte 제거하기 (0) 2019.06.20 python code debugging (0) 2019.06.14 ARM에서 PC 레지스터가 낳은 의문점 (0) 2019.06.11 push, pop (0) 2018.04.11