stack align troubleshooting
rop 문제를 풀다보면 특정 스택에 함수 위치를 넣게 된다.
그러다보면 스택이 깨지게 되면서 pwdgb로는 중간에 종료가 되던가 segmentaion fault 혹은 eof
서버로 payload를 보낼땐 segmentaion fault , eof 를 만나게 된다.

실제 ctf 대회에서 서버로 보낼때 segfault가 발생

근데 p64(ret) 를 rop 코드에 넣어주면

셸이 따지는 모습
그러면 왜 segfault가 발생할까?
알다시피 중요한 함수들 ( ex . system .. etc ) 에서는 movaps 명령어가 존재한다. 이 명령어는 스택이 16바이트로 정렬이 되어 있어야 한다.
그렇다면 어떻게 스택이 정렬되어 있는지 앎?
- call 실행 직전 RSP는 16의 배수 ( stack align O )
- 근데 이제 push rip 를 하니깐 ▼
- 함수의 entry point에선 RSP+8이 16의 배수 ( stack align X )
- 근데 이제 push rbp를 하니깐 ▼
- 함수의 프롤로그 실행 후 RSP는 16의 배수 ( stack align O )
- RBP는 항상 16의 배수 ( stack align O )
이것만 기억하면 된다. 특히 4를 기억하면 되는데 어차피 함수 프롤로그에서 rsp를 rbp에게 넘겨주기전에 push rbp를 하기에 함수의 entry에서는 정렬이 되어있지 않다고 보면 된다.