0

리턴 가젯의 체인에 대해 질문드립니다!

안녕하세요, 강의 내용에서 보면, 여러개의 리턴 가젯들을 묶어서 연속으로 payload가 실행될 수 있게끔 합니다.

여기서 계속 의문이 생기는 부분은… 예를들어서 pop rdi ; ret 가젯에 이어서 pop rdi; pop r15; ret 가젯을 이어서 실행할때,
첫번째 가젯인 pop rdi; ret 가젯을 이용하여
rdi에 read_got 값을 넣고,
ret으로 puts 함수를 호출하게 되면,
puts(read_got)가 실행되는 것 까지는 이해가 됩니다.
그러나, 이것이 호출된 뒤에 추가로 ret 명령어가 있는것이 아닌데도 자연스럽게 다음 가젯인 pop rdi; pop r15; ret가 실행되게 되는데
가젯과 가젯 사이의 연결고리, 즉 페이로드가 중간에 끊기지않고, puts 함수의 실행 뒤에 연이어서 다음 가젯이 실행되는 이유가 있나요?
아무리 생각해도 ret으로 puts(read_got)가 호출된 이후 프로그램이 종료되어야하는 것이 아닌가 싶어서 질문드립니다!

1 answers
0

함수 프롤로그와 에필로그 부분을 보시면 아시겠지만 leave;ret;을 하면서 스택이 호출 직전의 상태로 복원됩니다. 따라서 이어서 체이닝이 가능한겁니다.