비어있는 공간의 효율?
코드를 보면 buf[0x50]의 공간을 차지하지만 canary(0x08)를 넣는다면
원래는 sub rsp, 0x58이지만 stack alignment로 효율을 높이기 위해 16의배수(64bit컴파일)를 맞추어
sub rsp 0x60을 하는 걸로 알고 있습니다.
그러면 buf변수와 카나리 사이에 0x08이라는 빈공간이 생기는거 같고
프로그램의 크기가 커질수록 빈공간은 누적되는데
빈공간을 감안하고도 16배수를 맞추는것이 왜 더 효율적인지가 궁금합니다
#시스템_해킹
#공격기법
작성자 정보
답변
2
sangjun
공부벌레
https://stackoverflow.com/questions/672461/what-is-stack-alignment
여기서 첫번째 답변해석해보시면 알 수 있습니다
제가 이해한 내용을 말드리겠습니다
0000 want to
0001 fetch
0002
0003 이렇게 스택이 구성되어 있을 때 16byte를 fetch합니다
만약 0000에 값으로부터 2byte만큼이 있어 000을 fetch하려면 0000 0001 16byte가 fetch되는것이져
0000
0001 want to
0002 fetch
0003
근데 만약 0001에 값이 있으면 컴푸터는 16byte단위로 fetch하기 때문에 0000 0001을 먼저 fetch하고 0002와 0003까지 총 4byte를 fetch해야 되서 호울이 안 좋은 것 같습니다
juno2
답변 등록: 25
를 참고하시면 됩니다.
TL;DR
- System V ABI에서는 stack alignment가 16바이트이길 요구하고 있습니다.
- Automatic Vectorization https://en.wikipedia.org/wiki/Automatic_vectorization 를 위해 16-byte align을 요구합니다. (컴파일러의 최적화)
- 16byte alignment를 사용함으로써 cache line에 cross가 발생하지 않아, 보다 효율적인 데이터 접근이 가능해집니다.