Thắc mắc về stack frame 64 bit

Xin chào mn, mình có đoạn code C++ sau

int main(){
  char input[16];
  int num = 64;
  gets(input);
}

Mình đang học về lỗi tràn bộ đệm Stack buffer overflow. Theo như mình biết thì biến num sẽ chiếm 4 byte trên stack nhưng vì là 64 bit nên nó sẽ chiếm 8 byte, còn input sẽ chiếm 16 byte. Vậy nếu mình muốn ghi đè vào biến num thì mình cần ghi 16 byte để ghi hết input, nhưng lời giải đúng lại phải là ghi đè hết 24 byte, tức là input chiếm 24 byte rồi mới đến biến num chiếm 8 byte. Mình không hiểu cơ chế lắm ạ, mn có thể giúp mình giải đáp không ạ, mình cảm ơn

Every one-dimensional array in C++ has a header of 8 bytes (and another 4 bytes to store the size). Total 12 bytes. An integer has 4 bytes. So: 12 + 4 = 16 bytes. Is your question answered?

1 Like

Thank you for your response. However, I don’t think it fully addresses my question. I believe the issue is related to stack alignment in the System V ABI calling convention on x86-64, but I don’t fully understand how the mechanism works.

1 Like

This is a plain C array, so there’s no header or whatever involved. (The header size is also not correct if you want more info).

Back to the original question, you may want to check the endianness of the system and also better check the compiled asm since it could vary on different systems, for example: https://gcc.godbolt.org/z/h39e4qT45

2 Likes

Stack Alignment: Since in the past data was only accessed byte by byte and Intel 8086 is originally a 16-bit processor (2 bytes) and needs to be compatible with the old data bus… It’s a long story. Click HERE to lean more.
V ABI calling convention on x86-64: again, a long history. Click HERE to learn more.

1 Like

vì compiler nó thích thế.
thật sự là vậy.
có hơn 1 cách để align stack, compiler nó nghĩ cái nào tốt thì chọn cái đó.
ví dụ compiler có thể align như thế này

rbp
num
input
pad

hoặc thế này (re-ordering variables tại vì nó thích các biến hay access ở gần rbp nhất có thể)

rbp
pad
input
num

với code trên, vì không sử dụng biết num. một số compiler có thể không alloc biến đó luôn.
và thậm chí compiler có quyền không thực hiện stack alignment, bù lại performance tệ thôi. khi đó thì binary có thể sẽ như expect

rbp
num
input

nên compiler lúc compile code trên nó thích như thế này

rbp
num
pad
input

thì phải theo thôi.

fun note: stack frame cũng chỉ là 1 quy ước để dễ hơn trong việc phân vùng hàm (dọn dẹp dễ hơn, dễ debug hơn). compiler thích thì nó có quyền bỏ luôn stack frame hoặc tự nghĩ ra 1 cái khác để phân vùng.

1 Like

Ra là vậy, mình cảm ơn bạn nha

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?