완료됨
RTL 문제에서 아무 의미 없는 가젯 ret 를 추가하는 이유
이 강의에서 실습하는 문제에서 system의 가젯을 이용해서 공격할때 세그먼트 폴트가 발생할 수 있어서 8바이트를 미뤄주기 위해 아무 의미 없는 가젯을 추가한다고 했습니다. 제가 궁금한거는
- system 함수의 가젯이라는건 pop rdi;ret 로 시작해서 "bin/sh", system 함수까지의 페이로드를 의미하는건가요?
- 굳이 nop 코드가 아닌 ret 가젯으로 의미없는 8바이트를 채우는 이유가 궁금합니다.(pop rip를 통해 8바이트가 증가된다고 했던거 같기도 한데..)
- pop rdi의 작동원리가 궁금합니다. 결국 "bin/sh" 라는 문자열의 주소를 rdi 레지스터에 저장하는 코드인데 이러면 "bin/sh"라는 가젯이 스택에 알맞는 위치에 존재해야되는데, 페이로드가 스택에 어떤 순서로 buf 에 쓰이는지가 궁금합니다.
질문이 부족한 점 죄송합니다. 구글링도 계속 해봤는데, 통쾌한 답을 얻기가 어렵네요.. 헷갈리는게 많은 초보입니다.
#rtl
작성자 정보
답변
2
- system 함수의 가젯이라는건 pop rdi;ret 로 시작해서 “bin/sh”, system 함수까지의 페이로드를 의미하는건가요?
에... 간단하게 가젯은 ret으로 끝나는 연속된 어셈블러 코드의 뭉치를 이야기합니다.
예를들면
pop rax
pop rbx
ret
처럼요.
system함수의 가젯이라고 표현할수있는지 잘 모르겠네요...
- 굳이 nop 코드가 아닌 ret 가젯으로 의미없는 8바이트를 채우는 이유가 궁금합니다.(pop rip를 통해 8바이트가 증가된다고 했던거 같기도 한데…)
문제에 nx 보호기법이 걸려있고, 이 경우 nop은 실행되지 못합니다. 바로 셀코드를 삽입하지 못하는 이유와 같습니다.
- 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) 를 실행하려 할 것입니다.

