배경
libc의 지속적인 업데이트로 libc를 타깃으로 진행되었던 여러 공격 기법들이 막혔습니다.
No RELRO, Partial RELRO, Full RELRO 첫 등장 시기
처음 libc 취약점으로는 No RELRO 혹은 Partial RELRO로 컴파일되어 있을 경우 GOT Overwrite기법을 이용해 쉽게 exploit이 가능했다. 그 이유는 해당 시절 Full RELRO를 적용하기 위해서는 별도의 옵션을 추가했어야 했기 때문이다. 하지만 현대에 들면서 별도 옵션 없이 가능하게 되었다. 이로 인해 .got.plt 영역에 쓰기 권한을 가지지 않게 되면서 GOT Overwrite 공격 기법이 어려워졌다.
RELRO가 뭔데?
- No RELRO :
- Partial RELRO :
- Full RELRO :
Heap 공격을 활용한 우회 기법 등장
위 Full RELRO를 설정하면서 .got.plt영역에 쓰기 권한이 없어서 GOT Overwrite기법이 어려워졌는데, 이를 해결하기 위해서 __malloc_hook 혹은 free_hook 같은 libc 내부의 훅을 활용한 공격 기법이 등장했다.
공격자가 원가젯의 주소를 등록한 뒤 malloc() 혹은 free()를 호출해 원가젯을 실행하여 셸을 획득할 수 있었습니다.
하지만 이런 노력에서 개발자들은 glibc의 업데이트로 __*_hook들이 더 이상 사용되지 않도록 패치되었습니다.
.got.plt를 이용한 GOT Overwrite 등장
이런 상황에서 libc의 .got.plt 영역을 대상으로 GOT Overwrite 기법이 등장하였습니다. libc 또한 하나의 ELF 파일로써 .got.plt섹션을 가지고 있습니다. 또한 libc는 2.37 버전 전으로는 Partial RELRO로 되어 있으므로 내부의 GOT를 덮어쓰는 방식으로 공격이 가능했습니다.