0x10 정렬 관련 질문이 있습니다!

0x10 의 배수만큼 스택을 정렬해줘야 오류를 면할 수 있다고 하여
아무 의미 없는 바이트를 추가하기 위해 \x90과 같은 NOP 바이트를 더미로 추가해보았습니다.
그렇지만 \x90과 같은 NOP 바이트를 pop rdi; ret 가젯 앞에 필요 부분만큼 추가하였는데도 EOF 오류가 납니다.
예제의 익스플로잇 코드와 같이 다른 부분의 ret 가젯을 굳이 꺼내오는 것인지 이해가 잘 되지 않습니다.

#시스템_해킹 #공격기법 #rtl
작성자 정보
답변 1
avatar
Sechack
2024 Invitational Contenders

음 일단 nop바이트를 pop rdi가젯 앞에 추가하게 된다면 pop rdi가 원래 들어가있던 위치는 스택에 저장되어있던 return address로 함수 에필로그에서 rip로 들어가는데 거기를 nop으로 해버리면 0x9090909090909090이 rip에 들어가면서 터지겠죠. 그리고 스택이 정렬되어야 한다는 뜻이 rsp레지스터의 값이 0x10의 배수로 정렬되어야 한다는 뜻입니다. 따라서 스택에 어떤 값을 얼마나 넣고 안넣고는 중요하지 않고 rsp레지스터의 값을 바꿔주는게 중요한데요. ret은 pop rip; jmp rip와 같은 역할을 합니다. 이렇게 스택에서 rip로 주소를 꺼내오는 과정에서 rsp가 8증가하게 되고 결과적으로는 rsp값이 0x10단위로 정렬되게 되는겁니다. (보다 직관적인 이해를 위해 pop rip와 같은 표현을 썼지만 실제로는 rip레지스터는 피연산자로 올 수 없습니다.)

2022.02.21. 00:16
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기