오늘은 ROP 기법 중 하나인 RTC에 대해서 이야기 해보려고 한다.
ROP를 하려면 gadget을 이용해서 chain을 해야 하기 떄문에 gadget이 넉넉하게 있어야 한다. 즉 자기가 필요한 gadget이 있어야한다는 말이다.
그렇다면 gadget이 부족해서 원하는대로 chain을 하지 못하면 안되기 때문에 다른 함수들 중에서 레지스터 값을 바꿔주는 함수를 찾아서 그 함수를 이용해서 chain을 해야하는 것이다. 그 함수가 바로 __libc_csu_init 함수이다.
__libc_csu_init

위 사진은 함수의 어셈블리어로 어떻게 동작하는지 보여준다.
90번 줄을 보면 pop으로 레지스터를 스텍에 올리는 것을 알 수가 있다. 이 때 레지스터에 원하는 값을 넣어서 스택에 pop을 시킨 후 mov를 통해 원하는 레지스터에 값을 넣어주는 것을 확인 할 수가 있다. 그 후 73번 줄에 보이는 call를 통해서 원하는 함수를 call 할수도 있게 되는 것이다. 보면 알다시피 rbx 값은 0이 되어야 원하는 함수를 call 할 수 있다는 것을 확인 할 수가 있다.
이 기법을 공부하려면 이제는 어셈블리어가 눈에 보이기 시작하긴 해야하는 것 같다. 물론 아직 나도 어셈블리어를 볼 때 시간을 많이 들여야하고 잘 못하지만 흐름정도는 파악해야 하는 정도의 실력이 필요하다는 것을 다시금 깨달았다.