c언어 구조체 오버플로우 관련 질문 드립니다.

글쓴이: 익명 사용자 / 작성시간: 목, 2018/03/15 - 2:03오후
#include <stdio.h> typedef struct{ char a; char b; char c; char d; }abc; typedef struct { char k[2]; }b; void main() { int i=0; abc a1; b *b1; a1.a='a'; a1.b='b'; a1.c='c'; a1.d='d'; b1=(b*)&a1; printf("%c\n",b1->k[2]); for(i=0;i<6;i++){ printf("%c\n",b1->k[i]); } printf("%d\n",sizeof(*b1)); printf("%d",sizeof(a1)); }
여기서 구조체 b의 크기는 2바이트이고 문자 역시 2바이트만 담길수 있게끔 조작했습니다
그런데 출력은 abcd가 전부 출력되어집니다 원래는 오버플로우가 나야 하지 않나요?
Forums:
오버플로 발생합니다.[schoi0@SEL-SCHOI0
오버플로 발생합니다.
설령, 출력 결과물이 바뀌지 않는다해도 오버플로는 발생하고 있습니다. 단지 인지하지 못하고 있는 것 뿐이고요.
이런 메모리 경계 침범 사고가 발생하면 전혀 뜬금없는 곳에서 프로그램이 죽기 때문에 누가 어디서 사고를 쳤는지 알아내기가 힘들고요.
음 ..
어떤 오버플로우를 기대하신건지..?
단순히 허용되지 않은 주소의 값을 읽어 내는 것은 오버플로우라고 부르지 않습니다.
b1->k[2] 는 k[] 의 인덱스 범위를 초과해서 접근했지만..
다행히도 a1 의 메모리 범위 내에 있기 때문에 문제는 일어나지 않았고..
for loop 에서는 a1 의 범위를 초과해서 정의되지 않은 메모리 주소에 접근했는데..
프로그램이 간단하고 운이 좋아 문제가 발생하지 않았을 뿐입니다.
혹시 b1->k[4] 와 b1->k[5] 에서 a1 의 다음 변수인 b1 의 내용이 찍히지 않을까 생각하신거라면..
변수들이 어떻게 배치될지는 컴파일러나 버퍼 오버플로우 프로텍션과 같은 기능에 따라 다르기 때문에 어떻게 될지 알 수 없습니다.
a1 와 b1 의 주소값을 찍어 보면, 그 차이가 sizeof(a1) 보다는 크게 나올겁니다.
다른 타입의 포인터로 캐스팅 해서 쓰는 경우에는..
내가 접근할 수 있는 메모리가 어디까지인지 정확하게 계산하고..
그 범위를 벗어나지 않도록 해야 합니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기