ROP는 리턴 가젯을 사용하여 복잡한 실행 흐름을 구현하는 기법입니다. 공격자는 이를 이용해서 문제 상황에 맞춰 return to library, return to dl-resolve, GOT overwrite 등의 페이로드를 구성할 수 있습니다
<aside> 🎬 ASLR & NX
**Address Space Layout Randomization(ASLR)**은 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법입니다.
특징
코드 영역의 main
함수를 제외한 다른 영역의 주소들은 실행할 때마다 변경됩니다.
실행할 때 마다 주소가 변경되기 때문에 바이너리를 실행하기 전에 해당 영역들의 주소를 예측할 수 없습니다.
바이너리를 반복해서 실행해도 libc_base
주소 하위 12비트 값과 printf
주소 하위 12비트 값은 변경되지 않습니다.
리눅스는 ASLR이 적용됐을 때, 파일을 페이지(page)1 단위로 임의 주소에 매핑합니다. 따라서 페이지의 크기인 12비트 이하로는 주소가 변경되지 않습니다.
libc_base와 printf
의 주소 차이는 항상 같습니다.
ASLR이 적용되면, 라이브러리는 임의 주소에 매핑됩니다. 그러나 라이브러리 파일을 그대로 매핑하는 것이므로 매핑된 주소로부터 라이브러리의 다른 심볼들 까지의 거리(Offset)는 항상 같습니다.
NX
**No-eXecute(NX)**는 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법입니다
특징
gdb의 checksec을 사용하면 바이너리에 NX가 적용됬는지 확인할 수 있습니다.
NX가 적용된 바이너리는 실행될 때 각 메모리 영역에 필요한 권한만을 부여받습니다. </aside>
<aside> 🚡 PLT와 GOT
**PLT(Procedure Linkage Table)**는 외부 프로시저를 연결해주는 테이블입니다.
PLT가 참조하는 테이블입니다
<aside> 📬 Return To Library
return to libarary는 NX로 인해 버퍼에 주입한 셸코드를 실행하기 어렵지만 ret 주소는 덮을수 있는 것을 이용해서 실행 권한이 남아 있는 바이너리 코드 영역과 라이브러리 코드 영역중 라이브러리 코드 영역을 이용해서 libc의 함수들을 이용해 NX를 우회하는 기법이라고 한다.
</aside>
위와 같은 문제 풀이를 통해 library를 활용한 return to library를 알 수 있다.
<aside> 🪐 GOT Overwrite
위를 이용해 ret 가젯으로 어떤 함수의 got주소를 바꿔 호출하여 우리가 원하는 주소로 이동하여 실행하게 한다.
</aside>