RTL payload 구성 과정 중 return과 pop rdi; ret & bin/sh & system

안녕하세요 문제를 풀다 보니 아직 이해가 원할하지 않아서 질문 드립니다 도와주세요ㅠㅠㅠ

payload를 구성하는 단계에서
buf + canary + rbp + ret + pop rdi; ret + "bin/sh" + system@plt
인 것을 확인했습니다.

여기서 질문이 생겼습니다.

  1. rbp값까지 dummy값으로 덮은 후에 ret주소를 왜 ROPgadget --binary rtl 로 찾은 ret값으로 덮은 후에 pop rdi; ret 이라는 값을 그 이후에 또 덮는지 이해가 잘 안됩니다.
    ret 주소 이후에서 pop rdi; ret에서 ret이 또 있는데 어찌하여 ret이 두 번 진행되는 건가요??

  2. "bin/sh"를 rdi값에 넣은 후에 system명령어를 호출해야 되는 것으로 알고 있습니다. 근데 어째서 pop rid; ret 이후에 "bin/sh"에 대한 것을 넣으면 rdi값에 "bin/sh"가 들어가게 되는 건가요?

  3. system 명령어도 마찬가지로 어떻게 실행이 되는지 궁금합니다.

payload를 구성하는 단계가 아직 완벽히 이해되지 않아서 설명해주실 고수님들 부탁드립니다ㅠㅠ

#pwnable
작성자 정보
답변 1

우선 함수 스택 프레임, 함수 호출 과정, 함수 호출 규약에 대해서 잘 이해하고 계셔야 페이로드를 이해하고 구성하시는데 큰 어려움이 없으실 겁니다.

  1. rbp값까지 dummy값으로 덮은 후에 ret주소를 왜 ROPgadget --binary rtl 로 찾은 ret값으로 덮은 후에 pop rdi; ret 이라는 값을 그 이후에 또 덮는지 이해가 잘 안됩니다.
    ret 주소 이후에서 pop rdi; ret에서 ret이 또 있는데 어찌하여 ret이 두 번 진행되는 건가요??
    -> system 함수 내부에서 스택이 0x10바이트 단위로 정렬되어있지 않으면, 세그먼트 폴트가 발생하기때문에 ret 가젯을 하나 더 추가하여, pop rip 명령어가 수행되면서 스택이 rsp가 가리키는 스택 주소가 0x10바이트로 정렬되게하기위함입니다. https://hackyboiz.github.io/2020/12/06/fabu1ous/x64-stack-alignment/ 이 글을 참고하시면 좋을 거 같습니다.
  2. "bin/sh"를 rdi값에 넣은 후에 system명령어를 호출해야 되는 것으로 알고 있습니다. 근데 어째서 pop rid; ret 이후에 "bin/sh"에 대한 것을 넣으면 rdi값에 "bin/sh"가 들어가게 되는 건가요?
    -> 넵 맞습니다. pop rdi 명령어가 실행되면서 현재 rsp가 가리키는 곳에는 "/bin/sh" 문자열이 있기때문에 rdi 레지스터에 "/bin/sh"이 저장되게 됩니다.
  3. system 명령어도 마찬가지로 어떻게 실행이 되는지 궁금합니다.
  4. -> pop rdi; ret 가젯에서 pop rdi를 통해서 "/bin/sh" 문자열을 rdi 레지스터가 가리키게 한 이후, 남은 ret 명령어가 실행되면서 현재 rsp가 system@plt를 가리키고 있기때문에 ret 명령어가 실행되면서 pop rip 즉, system@plt로 실행흐름이 바뀌면서 system 함수가 호출되게 됩니다.
2024.08.24. 15:46
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기