rao.c에서 buf의 크기와 어셈블리에서 buf의 크기가 다른 이유

rao.c에서 buf의 크기는 0x28입니다. 이것을 컴파일한 후 gdb를 통해 disassemble 해서 생성된 어셈블리를 보면 크기가 0x30입니다.
차이가 나는 이유는 무엇일까요?
밑에서 같은 내용의 질문을 확인했는데 '설정한 크기에 추가적인 크기의 버퍼를 할당하는 경우가 있다라고 했고, 이것을 막기 위해 setvbuf 함수를 사용하지만, 문제에서는 변수를 선언한 후에 setvbuf를 사용해서? 버퍼의 크기가 고정되지 않은 것 같다라고 했습니다. 잘 이해가 안돼서 이 답변이 맞다면 추가적으로 설명 부탁드리고, 아니라면 답변 부탁드립니다!

#시스템_해킹 #공격기법 #buffer_overflow
Author
Answers 2
avatar
wyv3rn
무플 방지 위원회장

코드를 안봐서 잘 모르겠지만, 일단 컴파일 시 컴파일러는 효율적인 방법으로 알아서 버퍼를 확보하며, 이에 컴파일러, 컴파일하는 환경에 맞게 버퍼를 확보하려고 할겁니다.
다만, setvbuf를 통해 선언한 버퍼의 크기만큼 정확히 할당하도록 지정할 수 있습니다.
(자세한건 검색찬쓰)

더 크게 할당된 이유는 이것일거고,

답변 상으로는 버퍼를 할당하기 전에 setvbuf를 선언하여 이를 정확히 할당토록 해야하는데, 버퍼 할당 후 함수가 실행되어 알아서 할당한 것 같습니다.

저는 그래서 코드보단 실제 확보하는 버퍼의 크기를 직접 보는 편입니다 ㅎㅎ

2023.06.27. 14:55

답변 감사드립니다. 저도 궁금해서 계속 찾아봤는데 말씀하신 컴파일러가 알아서 버퍼를 확보하는 것은 stack alignment와 관련이 있는 것 같습니다. 디폴트가 16바이트라고 하네요. 그래서 조금의 실험(?)을 해봤는데 C 코드 상의 버퍼(배열) 크기를 0x21~0x30로 해서 컴파일 해봤을 때 실제 할당되는 버퍼 크기는 0x30으로 동일했고, 0x20으로 컴파일 하는 순간 실제 할당 버퍼 크기가 0x20이 되었네요!

2023.06.27. 15:48
Do you know the answer?
Share and earn points!
Answer and earn points