완료됨
RTL 문제에서 아무 의미 없는 가젯 ret 를 추가하는 이유

이 강의에서 실습하는 문제에서 system의 가젯을 이용해서 공격할때 세그먼트 폴트가 발생할 수 있어서 8바이트를 미뤄주기 위해 아무 의미 없는 가젯을 추가한다고 했습니다. 제가 궁금한거는

  1. system 함수의 가젯이라는건 pop rdi;ret 로 시작해서 "bin/sh", system 함수까지의 페이로드를 의미하는건가요?
  2. 굳이 nop 코드가 아닌 ret 가젯으로 의미없는 8바이트를 채우는 이유가 궁금합니다.(pop rip를 통해 8바이트가 증가된다고 했던거 같기도 한데..)
  3. pop rdi의 작동원리가 궁금합니다. 결국 "bin/sh" 라는 문자열의 주소를 rdi 레지스터에 저장하는 코드인데 이러면 "bin/sh"라는 가젯이 스택에 알맞는 위치에 존재해야되는데, 페이로드가 스택에 어떤 순서로 buf 에 쓰이는지가 궁금합니다.

질문이 부족한 점 죄송합니다. 구글링도 계속 해봤는데, 통쾌한 답을 얻기가 어렵네요.. 헷갈리는게 많은 초보입니다.

#rtl
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 2
avatar
wyv3rn
무플 방지 위원회장
avatar
wyv3rn
무플 방지 위원회장
  1. system 함수의 가젯이라는건 pop rdi;ret 로 시작해서 “bin/sh”, system 함수까지의 페이로드를 의미하는건가요?

에... 간단하게 가젯은 ret으로 끝나는 연속된 어셈블러 코드의 뭉치를 이야기합니다.
예를들면
pop rax
pop rbx
ret
처럼요.
system함수의 가젯이라고 표현할수있는지 잘 모르겠네요...

  1. 굳이 nop 코드가 아닌 ret 가젯으로 의미없는 8바이트를 채우는 이유가 궁금합니다.(pop rip를 통해 8바이트가 증가된다고 했던거 같기도 한데…)

문제에 nx 보호기법이 걸려있고, 이 경우 nop은 실행되지 못합니다. 바로 셀코드를 삽입하지 못하는 이유와 같습니다.

  1. pop rdi의 작동원리가 궁금합니다. 결국 “bin/sh” 라는 문자열의 주소를 rdi 레지스터에 저장하는 코드인데 이러면 "bin/sh"라는 가젯이 스택에 알맞는 위치에 존재해야되는데, 페이로드가 스택에 어떤 순서로 buf 에 쓰이는지가 궁금합니다.

결국 가젯은 스택의 값을 끌어다 씁니다.
현 스택에
pop rdi, ret gadget address
문자열 aaaaaaaa
system 함수 주소
와 같은 식으로 삽입되어있다면

메인함수 return시
pop rdi, ret gadget으로 return하게되고
pop rdi, ret gadget에서는
pop rdi를 수행하기 위해 스택의 다음 값인 aaaaaaaa를 rdi에 넣고
ret을 실행하기 위해 그 다음 줄을 참고해 리턴하려하며
여기에 system함수의 주소가 있기에 에를 실행하게 됩니다.
여기서 system함수는 인자를 1개 쓰는데 rdi 레지스터의 값을 인자로 쓰기에
결국 system(aaaaaaaa) 를 실행하려 할 것입니다.

2022.12.12. 15:54
avatar
wyv3rn
무플 방지 위원회장
avatar
wyv3rn
무플 방지 위원회장

네 그렇습니다 ㅎㅎ

2022.12.12. 18:52