개요

Return oriented programming은 stack overflow를 이용한 공격방식으로, DEP, ASLR이 실행되는 환경에서 임의의 Gadget을 이용하여 함수를 실행 시킬 수 있게 한다.

Procedure

공격자는 Ret Assembly의 특징을 이용하게 된다. Ret은 스택에 있는 주소로 Jump하는데, 스택에 Ret으로 끝나는 Sequence들을 주게 되면, Ret이 실행되면서 특정한 공격이 수행되게 된다. libc정도 되는 라이브러리에서 ROP를 이용하여 Turing complete한 프로그램을 작성할 수 있음이 증명되었다.

스택 overflow를 사용하면 stack을 변조할 수 있는데, 이를 이용하여 원하는 순서의 함수가 마치 실행되었던 것처럼 스택을 채우게 되면 연속되는 ret으로 인하여 지정된 순서되로 ret이 실행되며 프로그램이 변조되게 된다.

직접 스택에 프로그램을 채워도 된다만, 이럴 경우에는, DEP (NX bit)이 설정된 스택의 경우 execution이 불가능하기 때문에 실행시 fault가 난다는 단점이 있다. 이를 극복하기 위해서 ret이 스택의 특정 주소로 점프한다는 특징을 살려서 스택을 채워넣는 것이다.

참고

  1. https://github.com/mantvydasb/RedTeaming-Tactics-and-Techniques/blob/master/offensive-security/code-injection-process-injection/binary-exploitation/rop-chaining-return-oriented-programming.md